From 9bb4f858022f47dbced2b0c38814fae504e606a4 Mon Sep 17 00:00:00 2001 From: Exterrata <38149279+Exterrata@users.noreply.github.com> Date: Sun, 25 Oct 2026 02:46:35 -0400 Subject: [PATCH] CVR Manager 1.0.0 Co-Authored-By: Claude Sonnet 5.5 --- .gitignore | 5 + App.axaml | 164 ++ App.axaml.cs | 18 + Assets/app-icon.png | Bin 0 -> 69492 bytes Assets/app.ico | Bin 0 -> 36612 bytes CVRManager.csproj | 31 + CacheGuard/0Harmony.dll | Bin 0 -> 263168 bytes CacheGuard/CVRCacheGuard.dll | Bin 0 -> 11776 bytes CacheGuard/Mono.Cecil.Mdb.dll | Bin 0 -> 43008 bytes CacheGuard/Mono.Cecil.Pdb.dll | Bin 0 -> 86528 bytes CacheGuard/Mono.Cecil.Rocks.dll | Bin 0 -> 27648 bytes CacheGuard/Mono.Cecil.dll | Bin 0 -> 339456 bytes CacheGuard/MonoMod.RuntimeDetour.dll | Bin 0 -> 108032 bytes CacheGuard/MonoMod.Utils.dll | Bin 0 -> 188416 bytes Models/Models.cs | 195 ++ Program.cs | 16 + Services/AccountService.cs | 58 + Services/AppManifest.cs | 58 + Services/AssemblyReader.cs | 70 + Services/AvailableModsService.cs | 69 + Services/BranchCodeService.cs | 36 + Services/CacheGuardService.cs | 129 ++ Services/CacheService.cs | 169 ++ Services/ConfigStore.cs | 91 + Services/CvrmgService.cs | 101 + Services/FileOps.cs | 43 + Services/GameWindow.cs | 91 + Services/GitHubService.cs | 102 + Services/HookService.cs | 130 ++ Services/InstallFolders.cs | 35 + Services/MlLogColours.cs | 99 + Services/ModImportService.cs | 217 +++ Services/ModStore.cs | 183 ++ Services/MultiInstance.cs | 48 + Services/Paths.cs | 59 + Services/SteamDownloader.cs | 399 ++++ Services/SteamIntegration.cs | 73 + Services/SteamLink.cs | 146 ++ Services/ThemeService.cs | 196 ++ Services/TokenVault.cs | 17 + Services/UpdateService.cs | 135 ++ Services/Vdf.cs | 99 + ViewModels/Base.cs | 33 + ViewModels/GalleryViewModel.cs | 154 ++ ViewModels/ItemViewModels.cs | 934 ++++++++++ ViewModels/MainViewModel.cs | 1638 +++++++++++++++++ Views/LogView.cs | 453 +++++ Views/MainWindow.axaml | 627 +++++++ Views/MainWindow.axaml.cs | 148 ++ Views/WindowIcons.cs | 41 + app.manifest | 18 + .../2026-10-05-add-folder-id-suffix.ps1 | 87 + .../2026-10-05-flatten-install-layout.ps1 | 140 ++ .../2026-10-05-import-branch-codes.ps1 | 99 + ...6-10-05-import-steam-unlocked-branches.ps1 | 64 + .../2026-10-05-repair-real-config-folders.ps1 | 66 + .../2026-10-13-menu-patch-to-command-hook.ps1 | 59 + ...-10-19-remove-leftover-menu-patch-hook.ps1 | 33 + scripts/release.ps1 | 37 + 59 files changed, 7913 insertions(+) create mode 100644 .gitignore create mode 100644 App.axaml create mode 100644 App.axaml.cs create mode 100644 Assets/app-icon.png create mode 100644 Assets/app.ico create mode 100644 CVRManager.csproj create mode 100644 CacheGuard/0Harmony.dll create mode 100644 CacheGuard/CVRCacheGuard.dll create mode 100644 CacheGuard/Mono.Cecil.Mdb.dll create mode 100644 CacheGuard/Mono.Cecil.Pdb.dll create mode 100644 CacheGuard/Mono.Cecil.Rocks.dll create mode 100644 CacheGuard/Mono.Cecil.dll create mode 100644 CacheGuard/MonoMod.RuntimeDetour.dll create mode 100644 CacheGuard/MonoMod.Utils.dll create mode 100644 Models/Models.cs create mode 100644 Program.cs create mode 100644 Services/AccountService.cs create mode 100644 Services/AppManifest.cs create mode 100644 Services/AssemblyReader.cs create mode 100644 Services/AvailableModsService.cs create mode 100644 Services/BranchCodeService.cs create mode 100644 Services/CacheGuardService.cs create mode 100644 Services/CacheService.cs create mode 100644 Services/ConfigStore.cs create mode 100644 Services/CvrmgService.cs create mode 100644 Services/FileOps.cs create mode 100644 Services/GameWindow.cs create mode 100644 Services/GitHubService.cs create mode 100644 Services/HookService.cs create mode 100644 Services/InstallFolders.cs create mode 100644 Services/MlLogColours.cs create mode 100644 Services/ModImportService.cs create mode 100644 Services/ModStore.cs create mode 100644 Services/MultiInstance.cs create mode 100644 Services/Paths.cs create mode 100644 Services/SteamDownloader.cs create mode 100644 Services/SteamIntegration.cs create mode 100644 Services/SteamLink.cs create mode 100644 Services/ThemeService.cs create mode 100644 Services/TokenVault.cs create mode 100644 Services/UpdateService.cs create mode 100644 Services/Vdf.cs create mode 100644 ViewModels/Base.cs create mode 100644 ViewModels/GalleryViewModel.cs create mode 100644 ViewModels/ItemViewModels.cs create mode 100644 ViewModels/MainViewModel.cs create mode 100644 Views/LogView.cs create mode 100644 Views/MainWindow.axaml create mode 100644 Views/MainWindow.axaml.cs create mode 100644 Views/WindowIcons.cs create mode 100644 app.manifest create mode 100644 scripts/migrations/2026-10-05-add-folder-id-suffix.ps1 create mode 100644 scripts/migrations/2026-10-05-flatten-install-layout.ps1 create mode 100644 scripts/migrations/2026-10-05-import-branch-codes.ps1 create mode 100644 scripts/migrations/2026-10-05-import-steam-unlocked-branches.ps1 create mode 100644 scripts/migrations/2026-10-05-repair-real-config-folders.ps1 create mode 100644 scripts/migrations/2026-10-13-menu-patch-to-command-hook.ps1 create mode 100644 scripts/migrations/2026-10-19-remove-leftover-menu-patch-hook.ps1 create mode 100644 scripts/release.ps1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4e6a2f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +bin/ +obj/ +dist/ +*.user +.vs/ diff --git a/App.axaml b/App.axaml new file mode 100644 index 0000000..4b9e92b --- /dev/null +++ b/App.axaml @@ -0,0 +1,164 @@ + + + + + + #5B8CFF + F0 M118.77,2.25 L123.25,2.08 L194.00,2.11 L195.00,2.01 L195.50,2.09 L196.25,2.47 L196.53,2.75 L198.03,5.50 L198.58,6.25 L200.00,8.93 L200.57,9.75 L201.00,10.70 L201.59,11.50 L202.05,12.50 L202.59,13.25 L204.00,15.92 L204.58,16.75 L205.05,17.75 L205.60,18.50 L206.00,19.39 L206.60,20.25 L208.00,22.89 L208.60,23.75 L209.00,24.65 L209.62,25.50 L210.09,26.50 L210.62,27.25 L212.00,29.87 L212.61,30.75 L213.00,31.62 L213.63,32.50 L214.10,33.50 L214.63,34.25 L216.00,36.85 L216.62,37.75 L217.00,38.60 L217.65,39.50 L218.00,40.30 L218.64,41.25 L220.00,43.83 L220.65,44.75 L221.00,45.56 L222.66,48.25 L224.00,50.81 L224.66,51.75 L225.00,52.54 L226.67,55.25 L228.00,57.78 L229.69,60.50 L231.00,63.00 L232.69,65.75 L233.16,66.75 L233.70,67.50 L235.01,70.00 L235.68,71.00 L236.16,72.00 L236.71,72.75 L237.04,73.50 L237.71,74.50 L239.04,77.00 L239.80,78.25 L240.25,78.58 L240.50,78.55 L240.80,78.25 L241.19,77.25 L242.61,75.00 L243.08,74.00 L243.61,73.25 L244.07,72.25 L244.59,71.50 L245.05,70.50 L245.74,69.50 L246.07,68.75 L246.75,67.78 L248.08,65.25 L248.61,64.50 L249.07,63.50 L249.62,62.75 L250.09,61.75 L250.75,60.81 L252.08,58.25 L253.75,55.56 L254.11,54.75 L254.75,53.83 L256.11,51.25 L256.63,50.50 L257.10,49.50 L257.65,48.75 L258.13,47.75 L258.75,46.85 L261.12,42.50 L261.67,41.75 L262.14,40.75 L262.67,40.00 L265.13,35.50 L266.70,33.00 L267.16,32.00 L267.66,31.25 L268.15,30.25 L268.69,29.50 L269.15,28.50 L269.70,27.75 L270.17,26.75 L270.71,26.00 L272.15,23.25 L272.70,22.50 L273.17,21.50 L273.73,20.75 L274.19,19.75 L274.72,19.00 L276.17,16.25 L276.71,15.50 L277.18,14.50 L277.74,13.75 L280.18,9.25 L280.74,8.50 L281.20,7.50 L281.75,6.75 L282.21,5.75 L282.74,5.00 L283.19,4.00 L284.16,2.50 L284.75,2.15 L285.50,2.04 L394.50,2.08 L400.00,2.29 L405.50,2.71 L412.25,3.74 L413.75,4.14 L416.92,4.75 L420.73,5.75 L426.89,7.75 L428.00,8.28 L429.50,8.74 L430.50,9.26 L431.88,9.75 L432.75,10.25 L434.13,10.75 L435.00,11.31 L436.20,11.75 L437.00,12.28 L438.15,12.75 L439.00,13.34 L440.00,13.77 L440.75,14.33 L441.75,14.77 L442.50,15.34 L443.37,15.75 L444.00,16.25 L445.00,16.79 L445.53,17.25 L446.50,17.77 L450.75,20.79 L455.75,24.81 L459.00,27.76 L462.07,30.75 L466.00,34.92 L469.00,38.50 L472.00,42.38 L475.02,46.75 L477.00,49.93 L477.39,50.75 L478.00,51.59 L478.50,52.70 L479.06,53.50 L479.48,54.50 L480.00,55.25 L480.50,56.50 L481.10,57.50 L481.46,58.50 L482.04,59.50 L482.45,60.75 L483.00,61.75 L483.40,63.00 L484.01,64.25 L484.44,65.75 L485.03,67.00 L485.49,68.75 L486.00,69.97 L486.41,71.75 L487.08,73.75 L487.46,75.75 L488.05,77.75 L488.40,80.00 L489.00,82.78 L489.58,88.00 L489.84,89.50 L490.10,93.00 L490.17,102.50 L490.06,106.25 L489.82,108.75 L489.00,115.38 L488.47,117.75 L488.03,120.50 L487.45,122.50 L487.07,124.50 L485.00,131.22 L484.50,132.29 L484.00,133.96 L483.46,135.00 L483.00,136.39 L482.43,137.50 L481.98,138.75 L481.40,139.75 L481.00,140.85 L480.44,141.75 L480.00,142.86 L479.41,143.75 L479.00,144.73 L478.47,145.50 L478.02,146.50 L477.50,147.25 L477.01,148.25 L476.44,149.00 L474.98,151.50 L473.50,153.53 L473.00,154.40 L469.00,159.67 L464.82,164.50 L460.77,168.75 L456.25,172.87 L452.84,175.75 L448.75,178.83 L447.68,179.50 L447.16,180.00 L446.91,180.50 L447.05,181.00 L447.98,182.50 L448.43,183.50 L448.97,184.25 L449.42,185.25 L450.00,186.03 L450.44,187.00 L451.00,187.78 L451.44,188.75 L451.96,189.50 L452.42,190.50 L452.96,191.25 L453.42,192.25 L454.00,193.05 L454.42,194.00 L455.00,194.81 L456.40,197.50 L457.00,198.36 L457.40,199.25 L459.00,201.82 L460.40,204.50 L461.00,205.39 L461.38,206.25 L463.00,208.85 L463.50,209.93 L465.00,212.44 L465.37,213.25 L466.00,214.14 L466.50,215.22 L467.00,215.89 L469.35,220.25 L470.00,221.18 L470.50,222.25 L471.04,223.00 L471.50,223.99 L472.00,224.71 L473.47,227.50 L474.00,228.22 L474.48,229.25 L475.03,230.00 L475.48,231.00 L476.00,231.75 L477.46,234.50 L478.00,235.23 L478.46,236.25 L479.00,236.98 L479.47,238.00 L480.01,238.75 L481.44,241.50 L482.00,242.28 L482.43,243.25 L483.00,244.03 L483.50,245.10 L484.13,246.00 L484.70,247.25 L484.63,247.75 L484.00,247.93 L396.50,247.91 L395.50,247.14 L394.90,246.00 L394.34,245.25 L393.88,244.25 L393.32,243.50 L392.86,242.50 L392.33,241.75 L391.88,240.75 L391.33,240.00 L390.87,239.00 L390.32,238.25 L389.86,237.25 L389.30,236.50 L388.84,235.50 L388.32,234.75 L387.86,233.75 L387.32,233.00 L386.85,232.00 L386.29,231.25 L385.83,230.25 L385.28,229.50 L383.84,226.75 L383.29,226.00 L382.82,225.00 L382.26,224.25 L381.79,223.25 L381.25,222.50 L379.81,219.75 L379.26,219.00 L378.79,218.00 L378.25,217.27 L377.77,216.25 L377.25,215.52 L375.93,213.00 L375.25,212.03 L374.91,211.25 L374.25,210.32 L372.90,207.75 L372.25,206.79 L371.90,206.00 L371.25,205.07 L370.75,204.02 L370.25,203.35 L368.89,200.75 L368.25,199.83 L367.88,199.00 L367.25,198.12 L366.75,197.11 L366.00,196.24 L365.25,196.02 L311.75,196.05 L310.75,196.13 L310.25,196.06 L309.86,195.75 L309.81,195.50 L309.97,195.00 L310.71,194.00 L311.15,193.00 L311.75,192.17 L312.17,191.25 L312.75,190.43 L313.25,189.34 L314.75,186.84 L315.12,186.00 L316.82,183.25 L317.25,182.29 L317.75,181.57 L319.23,178.75 L319.75,178.06 L320.23,177.00 L320.75,176.30 L321.23,175.25 L321.77,174.50 L323.20,171.75 L323.75,170.99 L324.20,170.00 L324.76,169.25 L325.20,168.25 L325.75,167.48 L326.19,166.50 L326.75,165.69 L327.25,164.61 L327.75,163.92 L328.16,163.00 L328.75,162.20 L329.25,161.12 L329.75,160.45 L331.25,157.55 L331.75,156.87 L333.25,154.05 L333.83,153.25 L335.24,150.50 L335.78,149.75 L336.23,148.75 L336.79,148.00 L337.24,147.00 L337.79,146.25 L339.22,143.50 L339.75,142.75 L340.20,141.75 L340.75,141.00 L341.25,139.92 L341.75,139.25 L342.25,138.18 L342.75,137.48 L344.25,134.63 L344.86,133.75 L345.25,132.85 L345.86,132.00 L348.25,127.56 L348.75,126.89 L349.25,125.82 L349.75,125.15 L350.25,124.07 L350.82,123.25 L352.25,120.50 L353.50,118.63 L354.25,118.26 L354.75,118.19 L355.75,118.27 L393.25,118.36 L397.00,118.06 L399.25,117.57 L401.50,116.68 L403.25,115.65 L404.75,114.58 L405.98,113.50 L408.00,111.51 L409.89,109.25 L410.96,107.50 L411.88,105.50 L412.46,103.25 L412.87,101.00 L412.91,98.00 L412.76,96.25 L411.94,92.75 L411.00,90.66 L409.94,89.00 L408.98,87.75 L407.75,86.41 L405.22,84.00 L403.96,83.00 L403.07,82.50 L402.44,82.00 L400.25,80.92 L397.25,80.08 L396.25,79.91 L394.00,79.77 L337.50,79.79 L336.75,79.92 L336.30,80.25 L335.77,81.25 L335.23,82.00 L334.76,83.00 L334.21,83.75 L333.75,84.75 L333.20,85.50 L332.75,86.47 L332.21,87.25 L331.76,88.25 L331.21,89.00 L330.75,90.00 L330.19,90.75 L329.75,91.73 L329.19,92.50 L327.75,95.24 L327.20,96.00 L326.75,96.98 L326.25,97.63 L325.75,98.67 L325.25,99.36 L323.75,102.22 L323.25,102.88 L322.75,103.93 L322.16,104.75 L321.75,105.65 L320.25,108.12 L319.75,109.20 L319.25,109.86 L318.75,110.91 L318.15,111.75 L317.75,112.63 L317.25,113.32 L315.83,116.00 L315.15,117.00 L314.75,117.89 L314.13,118.75 L311.75,123.13 L311.25,123.79 L310.75,124.86 L310.12,125.75 L307.81,130.00 L306.24,132.50 L303.79,137.00 L303.23,137.75 L302.75,138.78 L302.22,139.50 L299.77,144.00 L299.22,144.75 L298.75,145.75 L298.21,146.50 L296.75,149.27 L296.22,150.00 L295.75,151.01 L295.20,151.75 L294.74,152.75 L294.19,153.50 L292.75,156.24 L292.20,157.00 L291.74,158.00 L291.17,158.75 L290.75,159.69 L290.18,160.50 L288.75,163.22 L288.18,164.00 L287.72,165.00 L287.16,165.75 L286.71,166.75 L286.17,167.50 L284.75,170.21 L284.16,171.00 L283.70,172.00 L283.15,172.75 L281.70,175.50 L281.17,176.25 L280.75,177.19 L280.15,178.00 L279.69,179.00 L279.14,179.75 L278.68,180.75 L278.14,181.50 L277.69,182.50 L276.13,185.00 L275.67,186.00 L275.12,186.75 L273.69,189.50 L273.14,190.25 L272.75,191.11 L271.11,193.75 L269.75,196.35 L269.12,197.25 L268.65,198.25 L268.10,199.00 L265.75,203.32 L264.08,206.00 L261.75,210.30 L261.09,211.25 L260.75,212.01 L260.06,213.00 L257.75,217.26 L256.05,220.00 L253.75,224.25 L252.03,227.00 L250.72,229.50 L250.05,230.50 L249.73,231.25 L248.02,234.00 L246.71,236.50 L245.01,239.25 L244.69,240.00 L244.15,240.75 L242.70,243.50 L241.15,246.00 L240.75,247.12 L240.50,247.35 L240.25,247.38 L239.81,247.00 L237.62,243.00 L237.07,242.25 L236.61,241.25 L236.06,240.50 L234.62,237.75 L234.08,237.00 L233.61,236.00 L233.05,235.25 L232.59,234.25 L232.05,233.50 L230.61,230.75 L230.06,230.00 L229.60,229.00 L229.04,228.25 L228.57,227.25 L227.05,224.75 L226.59,223.75 L226.04,223.00 L225.57,222.00 L224.01,219.50 L222.57,216.75 L221.01,214.25 L220.54,213.25 L220.01,212.50 L218.55,209.75 L218.00,209.00 L217.54,208.00 L217.00,207.28 L214.68,203.00 L213.00,200.32 L211.66,197.75 L211.00,196.77 L210.67,196.00 L209.00,193.33 L208.50,192.28 L207.00,189.79 L206.64,189.00 L206.00,188.09 L205.50,187.04 L205.00,186.35 L203.64,183.75 L203.00,182.82 L202.63,182.00 L202.00,181.12 L201.61,180.25 L201.00,179.36 L199.61,176.75 L199.00,175.87 L198.61,175.00 L198.06,174.25 L197.59,173.25 L197.00,172.41 L195.61,169.75 L195.00,168.89 L194.60,168.00 L194.00,167.19 L193.58,166.25 L193.00,165.42 L191.60,162.75 L191.00,161.92 L190.58,161.00 L190.00,160.22 L189.56,159.25 L189.00,158.44 L187.59,155.75 L187.02,155.00 L186.57,154.00 L186.00,153.23 L184.56,150.50 L184.00,149.69 L183.57,148.75 L183.01,148.00 L182.55,147.00 L181.99,146.25 L180.55,143.50 L180.00,142.74 L179.55,141.75 L178.99,141.00 L178.53,140.00 L177.98,139.25 L176.55,136.50 L176.00,135.75 L175.53,134.75 L174.97,134.00 L174.51,133.00 L173.97,132.25 L172.52,129.50 L172.00,128.79 L171.52,127.75 L170.96,127.00 L170.50,126.02 L170.00,125.33 L169.50,124.25 L169.00,123.54 L168.51,122.50 L167.96,121.75 L167.50,120.78 L166.93,120.00 L166.50,119.04 L165.94,118.25 L164.50,115.51 L163.94,114.75 L163.50,113.80 L162.92,113.00 L162.50,112.08 L161.00,109.61 L160.50,108.56 L160.00,107.89 L159.50,106.86 L158.00,104.91 L157.50,103.96 L155.50,101.12 L152.53,97.75 L150.69,96.00 L148.34,94.00 L146.95,93.00 L146.05,92.50 L145.47,92.00 L144.50,91.53 L143.75,90.97 L142.63,90.50 L141.90,90.00 L140.54,89.50 L139.72,89.00 L138.25,88.55 L137.00,87.99 L134.93,87.50 L133.50,87.03 L127.75,86.16 L125.00,86.06 L122.00,86.16 L116.25,87.00 L114.72,87.50 L112.75,87.96 L111.55,88.50 L110.00,88.98 L109.11,89.50 L107.75,89.98 L106.99,90.50 L106.00,90.91 L105.21,91.50 L104.25,91.94 L103.50,92.55 L102.69,93.00 L100.00,95.03 L98.91,96.00 L95.92,99.00 L93.86,101.50 L91.91,104.25 L89.85,108.00 L87.90,112.75 L86.89,116.50 L86.09,122.00 L85.97,124.50 L86.04,127.50 L86.90,133.50 L87.45,135.25 L87.85,137.00 L88.88,139.75 L89.42,140.75 L89.87,142.00 L90.50,142.98 L90.80,143.75 L92.82,147.00 L94.91,149.75 L97.75,152.81 L101.00,155.68 L104.00,157.82 L104.88,158.25 L105.54,158.75 L106.68,159.25 L107.50,159.81 L108.71,160.25 L109.51,160.75 L111.00,161.21 L112.10,161.75 L114.00,162.23 L115.25,162.69 L121.25,163.73 L125.00,163.89 L129.00,163.67 L134.25,162.73 L135.75,162.19 L137.50,161.77 L138.75,161.16 L140.12,160.75 L141.00,160.22 L142.25,159.75 L144.25,158.54 L144.75,158.54 L145.25,158.85 L146.00,160.25 L146.50,160.88 L147.00,161.88 L147.50,162.56 L147.94,163.50 L148.50,164.27 L148.98,165.25 L149.50,165.92 L150.00,166.93 L150.50,167.59 L151.95,170.25 L152.50,170.97 L153.00,171.99 L153.56,172.75 L154.92,175.25 L156.54,177.75 L158.00,180.42 L159.52,182.75 L162.00,187.13 L162.50,187.77 L164.00,190.49 L165.50,192.81 L166.98,195.50 L167.53,196.25 L168.00,197.21 L168.50,197.84 L169.00,198.86 L169.50,199.52 L171.00,202.25 L171.57,203.00 L172.00,203.90 L172.50,204.57 L173.97,207.25 L174.54,208.00 L175.00,208.95 L175.59,209.75 L176.00,210.66 L176.50,211.31 L177.00,212.33 L177.52,213.00 L178.01,214.00 L178.57,214.75 L179.00,215.70 L179.50,216.37 L180.00,217.39 L180.50,218.02 L181.00,219.03 L181.54,219.75 L183.00,222.43 L183.50,223.07 L184.00,224.08 L184.51,224.75 L186.00,227.48 L186.50,228.13 L186.96,229.00 L187.50,229.65 L187.60,230.00 L187.52,230.50 L187.04,231.00 L186.00,231.46 L185.25,232.02 L184.25,232.44 L183.48,233.00 L182.50,233.39 L181.63,234.00 L180.50,234.45 L179.69,235.00 L178.50,235.44 L177.65,236.00 L176.50,236.40 L175.48,237.00 L174.06,237.50 L173.23,238.00 L171.75,238.48 L170.75,239.04 L169.50,239.40 L168.25,240.00 L166.58,240.50 L165.50,241.01 L163.75,241.49 L162.50,242.02 L160.57,242.50 L159.31,243.00 L157.25,243.47 L155.68,244.00 L153.25,244.48 L151.50,245.00 L148.50,245.52 L146.75,245.96 L142.75,246.48 L139.91,247.00 L129.50,247.81 L121.00,247.84 L111.00,247.13 L103.10,246.00 L101.10,245.50 L98.10,245.00 L96.25,244.45 L94.25,244.07 L92.49,243.50 L90.31,243.00 L89.00,242.48 L87.08,242.00 L85.90,241.50 L84.11,241.00 L83.00,240.47 L81.50,240.06 L80.25,239.45 L78.80,239.00 L77.75,238.43 L76.50,238.04 L75.50,237.47 L74.25,237.04 L73.25,236.46 L72.00,236.00 L71.25,235.50 L69.96,235.00 L69.24,234.50 L68.00,234.00 L67.25,233.46 L66.13,233.00 L65.25,232.39 L64.35,232.00 L63.50,231.39 L62.62,231.00 L61.75,230.36 L61.00,230.01 L60.25,229.44 L59.35,229.00 L57.00,227.35 L56.25,226.96 L52.00,223.96 L48.00,220.86 L44.50,217.93 L41.00,214.76 L36.88,210.75 L33.86,207.50 L29.75,202.76 L27.75,200.24 L24.75,196.22 L23.32,194.00 L22.75,193.32 L21.35,191.00 L20.75,190.25 L19.35,187.75 L18.75,186.92 L18.33,186.00 L17.75,185.21 L17.32,184.25 L16.75,183.40 L16.26,182.25 L15.75,181.49 L15.25,180.32 L14.74,179.50 L14.25,178.31 L13.66,177.25 L13.25,176.15 L12.73,175.25 L12.30,174.00 L11.75,173.01 L11.35,171.75 L10.73,170.50 L10.25,169.00 L9.75,167.97 L9.25,166.30 L8.69,165.00 L6.75,158.82 L5.67,154.75 L4.70,150.50 L3.71,145.25 L2.75,138.29 L2.28,131.50 L2.12,123.50 L2.30,118.00 L2.71,112.00 L3.69,104.75 L4.68,99.50 L5.71,95.00 L6.75,91.10 L7.25,89.70 L7.75,87.78 L8.25,86.53 L8.75,84.76 L9.25,83.65 L9.75,81.97 L10.25,80.93 L10.70,79.50 L11.25,78.39 L11.75,76.95 L12.27,76.00 L12.75,74.62 L13.28,73.75 L13.72,72.50 L14.25,71.64 L14.75,70.39 L15.25,69.62 L15.70,68.50 L16.25,67.69 L16.75,66.53 L17.30,65.75 L17.74,64.75 L18.30,64.00 L18.75,63.01 L19.29,62.25 L19.75,61.30 L20.25,60.65 L20.72,59.75 L21.30,59.00 L21.75,58.12 L22.25,57.50 L22.75,56.61 L27.75,49.70 L29.88,47.00 L33.75,42.53 L38.00,38.09 L41.45,34.75 L45.94,30.75 L48.41,28.75 L50.25,27.40 L50.95,26.75 L55.00,23.81 L57.25,22.41 L58.00,21.79 L59.00,21.26 L59.64,20.75 L60.50,20.33 L61.25,19.75 L62.25,19.27 L62.93,18.75 L63.97,18.25 L64.65,17.75 L65.75,17.27 L66.50,16.74 L67.50,16.33 L68.34,15.75 L69.50,15.29 L70.31,14.75 L71.50,14.29 L72.37,13.75 L73.50,13.36 L74.54,12.75 L75.75,12.34 L76.83,11.75 L78.25,11.28 L79.26,10.75 L80.75,10.28 L81.85,9.75 L83.49,9.25 L84.61,8.75 L86.44,8.25 L87.67,7.75 L89.50,7.27 L90.97,6.75 L99.00,4.75 L104.25,3.74 L111.36,2.75 Z + #7AA2FF + #9AB8FF + #B9CCFF + #4670D6 + #3858B0 + #2B4488 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/App.axaml.cs b/App.axaml.cs new file mode 100644 index 0000000..68d5c50 --- /dev/null +++ b/App.axaml.cs @@ -0,0 +1,18 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; +using CVRManager.Views; + +namespace CVRManager; + +public partial class App : Application +{ + public override void Initialize() => AvaloniaXamlLoader.Load(this); + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + desktop.MainWindow = new MainWindow(); + base.OnFrameworkInitializationCompleted(); + } +} diff --git a/Assets/app-icon.png b/Assets/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6481b01faaabe5dd6ec792eaa9c4df6c65919824 GIT binary patch literal 69492 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ß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�b7<` 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 kQ|VSzRfy0KO0UiT4d~#07;M1& literal 0 HcmV?d00001 diff --git a/Assets/app.ico b/Assets/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..208a932460aa3e1a0c0d5403214bb2030661de13 GIT binary patch literal 36612 zcmagFb980F(g%8C+qP}n=44{q&cr;id7_Ckv2APOOzdQ0+sT`I@B8zu_w`zP?XFeL z-BtCg?ye00fC1nDsHlK{i4@Qa4gjS8%VA>vk1m1$0KWZuaB=@f%R>SH&(Qx$lKzhl z{g)R<003xd|3?eK0szBk001lN|7bLL000~x01y@ZADxK=0ANr806{_jqbZ31fGW2C zzs0M0qJid!SW_u#jX_U$wS!C0K_FrP^0Jvf{GKJsc(sMQ=mgoFWKY6|WV8%>e-sXN?efHjch=8HSOU{5@^kIvFhxC#l zwe>+d`#V~m*3(wT{#1)puB}k|_>zef+!o8jI!MZ*BQr z(B!#KP8fBXrVzf%$mFA3oJwm{0OOL*UWo)-uG$mwt*x1SdKE$Y6MdpcAgKqSu*!Lo zi8}$0zSR}D+Bq^!sRJUCdJ*>yLXFPJrPlWf8d+M${Kol1#X3juYDHl&zKApTyl*_X zfz;{<_pEo+dPa#c5LT_HT=y-6im;tm)TKCNxG63XyC>h=rzs<(!AHLGOin3~Iya@S|`;{)cIQ+ zHXgpdfpf;;Z)&>CPYZspaP>GBTa=cyy#dqL zk0($8Ln1+1e=co?gUp1ya05N^6kS8MA|jr7f8a2XmTme+i zpnie6V9dljqS)b=WstRbU=F)ac@^HX85$wAP|{V^GX9XqO@vF!l`86H&4ks)C*o0i z+>6p2d0oS;9j|S*((0=eDEZMCwtNo&{``;w)#m4WKOo(Vdg*Uekj zO*k6gn)o~eWtm;#$IX30|DL9}zvT}5`X`tGIVoky8gb*0{}1u~k3wPoSA655i2i8- zgzf*tw>nk9+Cb``_;R>Sw*pX;m_-U$6V7}W7;^2_w(*+j&u0q;?&t^?Lnfq3Hb zidDVw5)W;^LagQGxeA(*!LGPLAHecC{$zP&(n7kVbq^UlNvGEAJrr#-PuG)xX(A6{ z=*dzT@^v`DT^-F{kkG|L_fj1^!penKSr~^Cs*#%@w5k5b>oH=w7y)(B-_dIzK zMHgx4J$Nh|ESOrOyf(ug)hmC(k9A`;w;08M*iK}kl3vz$RImW{osm7nJFB0+oMr-u ze_S#e&c?)392La3YG;ZJ&u?_fvYb2$5;pP+wfhtL?NZFQZ)(p}LAYQ@kLH;i%)en? z`lo*upk;Bv&R45SE45ukEfc=wS#FQ0Ad%kshATB{nZ93h7VWFdRoS#e|2{4g^E`IU z7Pn3FcsC~rV3+f6oSZnY@iJWb;`{&#l)raPey1UJWfW8pkv+)C=I7RAsMP0ufmJh0 z31tb84|oQY_mDL$m5JUC;yBfL9w27E)4n9Zpt&NJqcb16{IMRsR{3_&fU_jeI8A7E zTapk}ger2-Snr%t7WTK_pr7JZw__9O50`Ge{6yRkvF_WhW%anoxs|Ng2Hq-&P3RDN6E*DgJaD4QD&v-RapW_La-hJBDo~d1P z$%&%@!LrJ6av4l%!zN+uobqdW96}V7-O1%u7NYpedT$F`+o3UCZo2wfbIC7dg4OXu zlJG(2ys|i#*FdMb26Y{#Ox_z1+pEwHwXvF0=+DOb7M=@(7?b({n4U_|HC3>3!vCS7 z|G_xi|ElPYm(Vi+0EzZL6>Uz}u}}Sm8=mL(`IV=feW{$rEbBstDc>~L1X(OD8fl2j z#a7D3CLN1rHiXcPYDP{y0@^7lXRC>d3QKI$Zv$vm7Uo0i(zZx70hQr5e_gn@1acg` zO9(*4%}wy&aPa;1?YZl@ddfu$0&6QtqGD3VpLr2JgTw?23B>6^;Sj$LJ!-EV8e#UU ztmBgPEJl2{+DaRvIRh{D8MyPFCtjb+3CuU%Z4;F(r_#tXmNejHC_2=co;o;J z$9VopPTr}gYRs%nN%`~0n8p;=h8&5jTJkPQojf*Cc&Hu&Y)6p)=b3f-l=HYgIsK%* z^Rlw>VVbkSotdO9k8!v>XPXIJN3UN}R6hlOb+|*V>tb^pFCI*oCf$y?sbr@J^;$E| zpn9y8%WsB?4}hSY*a>@rsqwg zS)GOpbnA2~wI>eSgTS7d2P`f7jp1ahY_VraTRmK%JFLHOC1Ux0Hs6X4=bIEur=M;Y zwzTFODHIKO#Wc=*d2Lvn6OK#|<*27U<`zED54fguLcf}S;uCp_1Grt`HMW%)r z#2WpfvCPm|6n8Y{rlz3fKMthChR$fzzkBA~)9zdO zvWb%!;ABeXh{Si**d3c%<3Mfj6TTg*QAfPO;zWc@?x{AGW_F}oy*$h!n4{A{2L$9j zKVK=Ldo)i4JZxolvS2W3YQ-kP*zrLJ~ce$z8q458FqP3p^+V$wjnx19&^A__JOw1)+Jb0 zK67Hwuj;N21{RWbD!~fU2pPFodrc`H)2r7^tZ8OEmFT%LR{X;J!D{&` z90j~so4JUjrJ4LfZs=fS_JtbO@6^gYl|k!5zLSkX`EEvk&hTlj9RE`!_R0yyzMx}) zoFc}AK@nIz-%}W<_X!DMwN0f|_9^~6`NXPUp|%)+a?^Jr3&W3;p9sRYh1{ZV$5UMyaE?VJ3QCW2>AV9?TR){A<}GNM!M0Xuev`XbMPMn@KACS2X@ z^Mju!K-0XDDBI;;0Cv@Ui`o3Iv~DCSdbK6o@TR)Js~nm6AqF_lAueO6O?@L15e{l0 z&BUyS%9~FqQ|c0q0c38z2;EK=p8MVU3Hasf?=Yt2({9@W)0nF;{dUK>^R;H3gBl28 ze^n@p5L+8Q&=Rj9;i!T-MXa}0Oye2!ZW~;uOr>)(OqH$^K4-Cd4%O-(DUG-8p?L>1 zj%INmji3@A?{AI|ZaJlq}82qfDOF!i7Ltswl8Dpcx&+MOF`;_Y_ZZxUn6m==Q{X`8DDa z=F9|Y5uuk4KjAnbCBhMbBI&wCJbDcb!r@8ANRwdJGC|=*MkIzSY2)!hxlSS=&)*3&Hlzsad)5XK zTUee?(JtyHU2G{arip#yQny{ZdM0mA$|%ycX`Y2BeH6=VStoAdLS{%(hArUrIzQ46 zc+Fi!>OvcL(m$_t|FRn}mT_ zSN&jmiL^rN5*_t$`8l?pu!O*jS0-UV?(T9xRNiEA=QaG*{Z}NBQ6Mo9ZFX}VzL1j9 zvs{G2udj(ARgvshVHq<$60!EN!|DWW8m4BTiIi~RgLp!lT}rDoHc>SPAjWc@l})0i($fKE3VD?y}HOjwzh z6e_Ukw!rD`?1?!0CCmAs?Sha043(yiM^=Q|q~7K-4h;NEFOPAW>)Zz*5p>c{rG1?DWw$Q0KGEQQ^X$g8ykEyiU>Wmw&uaaA=Q^8I_s&p5 zpsloAX3jOYzlPegfx*(6lV6AJl7tpXDs;MGm(e)@zhlK=Yo#(vfNPEc{Td~J#@aM9J;$aEfk$*A;+pMY+W4K^E1;T}G97?Hh6yJ`aWX>-%Zv@4meMYti^z|D2+ zuZLwdjm0I{QG>5%NBPrd-tw%$5k-}--;Zsgbu|>&&JSd!CtqK`RzI|$mm5V3@tVnd z?o*xjneYj-)XISYbB4Oc-ZY!q8qf=-fu}erCnq;-sN0;4^c~!2Tluaar*P;&V?4!B zhp;g=FV2zynWm+bf$NDJ=9<>k=VCKf#Pt3uBW01PvzI`y#rL<7t?v5k{{w>lb09f>11`*hm-6)E%}3N zjl*@v>6@{Z9KTIBup1d&n030SvRK^}rjNBNSLUlu z!5O|^7t7eXUw~Ii8li2zE556%524;8@2xvc<3ET1Vdo+PUA8(Y1eexXZLoaAprJH2 zsC*R!LTue$*MeWqR69aemp5x-`I-V$`-MX4`5PF2zVd_>%RvwYND@Coi`! zIY}BSi^g6uM6(D$*izPP4BKcLClQf2tOSPgc5iF%RZ#{Ufr_EJ+9qw-hKd5L4bANG zfM0qF>a1?{#nsETNMTD0Hw)i+4@I#)I=feOpVT2oihMKHp&rj~^NCHt(7q(RFd!=$ zcX@Di0d!5%l5iXvHu{E^2H|XuzjqfuLEOd9K!0<5gC{ARX6$ zP(B5ZuKb>FxoVlZ$W5ljN?;o1jzk8vF)2m(zW+T@&Ql_b4O-5=cH^BUby5d@<_4T4 zmSdYh{5Hkx_=guvhstHR4NlnIVF+dk)^c1YIiMu}oe{g{i|&xeA4N+L`T$HfPIyN7 zk0>Kp4u2hl%;&qo5PU@<(do!W+IIg$tq2s4P{WcOU*fK=3W*<@gD){MHm`D93i$md zrk3A}&ZOQ4mw5z)w6-0_eK7g$GaLb#%l{q8$aWy4lGOX}YdR3~{YD;j);}Cj83tj9NTsQ#@ z@(ds?zX6IXB7?`q*IjtY>G|b1Am!i;!|)}MvCYS*xZ>RQ;=t4PuH6YAap2?A)4d5wW%D5dD{Brh8AfBM3eoDP z)TPsggE&g~MDVvlAr-bmPAExrJrC zirKDAjmRo_`U{zzh_76M(vuNvLxrot9I9rmWTNZ+Z&i2pHNHf@uM_`a?1WIBn33D* z($?GClOf`Ldu+rc1GT=2ac=Y=DZ>*!P;%v&CW22rfi8ODKU5u|^K)>)Q_a4stc_83 zdUN$xP$Kl$&NEMD?=Kg{%4@Ukc*}!(5 z?TFm~9LEte{}j%UXAM>}YIO*RWBW~Hj`YANP6_b`LVaE@RuC(_9zCs8tNkjl#Oo6| z?`01|+xcwfdCT}ot*NyOz>r|;QD=(YmS(k+q7gB>_=sPe8Sz@0*B7f(<)EzNUPnkf zcAOAF5%>Yd5-QKWv+ou?#_7ecx>77m9&d~%~ zndDU{+^5q-JJkm>L*#%VXXS~Z?Ib{%$fL4nDCpeJmwchLud|c*-=|~NzDdr3owiW5 zLrylIaq)BBp&LSnj^SIWhc)a@xlJT;<%MDXd^ck~_bX=c+%>;*GSTK7G2<3M>5blc z^smD>h{T!dU-j}V__)Y$`3&qFq(u=uRfPwp#gL6!^U^R~go+ zu>7EbDNXR7aS&}d@&{qtICF9+uCcMk;v)CfBaLqPp^N{}7oxpO5f}rOI`r2C0SSl? z{zx30d<2R>Gf?03_lp>pJy9YmV+miWpG(r6OXAtRJa3Ke@-ZX+4&$`;ffF#Pml^rz zsz6I%j~_Ip(f3?7wgs$i(pEc28ur^8HfLWB_C-|l2Htzz=h^M9Rdq3*iaf#c>luZm zoC0^Ij(Lw{Q``&&FM3D17PtRKmcnBfQ(=7hKdc|~HD=&o)${W8CE?&-=a@_@SyrKH zZ81Wt#I|RODNAT(6+(wym1KV8ryDv7)Os(ozotyU+N?xm6HUrJXF!2E51yp;Q7^<% z@9A7e3~j9h!N_5D!d6|;g;!IzDHS~=c^1d7V?5ZqkJ^+Zc zurX`vQmS<;rOJORA_4K04vKtedL+P-mD1!?T4nu18@iwij2_LJ?i1EkhYTQ`9Zhpb z*#TCwftBJLlgUNS4U(dq@p0H%jk_6Q$|-%jL4+HdTmQ&VZ^pm6;A3$Lr*I4h)xV^< zkuc{XM$&l1-0JnpqiVVy)B^c!3uU+|zL0JLo5FT~XdnbW{2$H(>pwp0f1QW#;4cvX z0Nl#|oQFkSID5=xyw9y{Gn8$bk&%_4{vk>#OzTJrVGFnuNnR9o4ZEh~>CC5b) z40x?B^=o+z4LQ{tOYR)uBOH5L{&lqB29EZXpF{|bS99Sm!XMJRPJjV+foK8>WD z49g8IAPavtWSg==D`n;2JWec&<_oMSMuB6a>aW?0?N6YikL?#p>-wp7S*BC2o6!7p zBgy7cIv2{u%B>cj{>Ou6hyjDWkBY9ZUflV-4uLfV34K;b$2cp~7Sb#+9*JQ-(6=Hn zb(gRs392SLao}Ye(O5r}2v6(h6kR(CFij!x8z)XjCPpv$qcK>GTNCk{PCEv-Y($qPap}xl6~+co3Rw&L{*lLzrV8ta`2sVqnq7$fRG)_uU-88=a?aWZA#aHV^vuo8JT*SCsKX$_kLw$U zM0FX?V{Dq-B8!0^Fx5ndwLV}SG%(`YJNl#V;Y>RlM1D>lECfQFurlO=<|dC41gcNR zzw5|D^ON`uM*PHi^a{W<8CQa!?0(9a4{1p+9MO4a)8)ht#=~N2P7hYG2*xCBoq^hq z&uDWSakW;WPH?{g=+5gS@WVHU5trS=A{_qw3520qWH6Blmxi+-guo3m`!|gO$0=^! zmcp>qVhkNzmR?V zEJF>yy!ulNz{P$S&B18kgKJsiPQh%uz6k$ZQ_tV~L>kM~f-q@El#Vcic)?OgH7j8! zXY(y>NW_G9*11?);pbhvgY4;iV9olxAr}umyEa!D^sj6+etlo88*q0b&v)wVaKzE_>qN@|McBssL;@58$q=1{2PB9pM23n| zQ^gU*S6KalV{|pZx^lM>Wd$%LE8NTWkp1;M>92?Vx*`c!_fG(Ki01DK|?z)onof2q;8bYbSeCyk1NxZ$3;so8F?PUZ*XGyq#_S34hlrwR>nZ*Dj+JKD11JBh)X? zz~z!D7wSIu#*D0|BT_#o4;(mIKmWKjI0Ts_*;n zAlOY?e2=4ofXS~tEyf?`GLg_yi1wDAY#;ca5B(~$K7Wy%2V;^?vC6(i-s+0fa1Aj= zTLLjItUPH)3eTcwMLhmeEPHc?8wHTj3R-P3MD4XSysJJaY(^aE9l@jYUg zNsgYn!xl&!q4qhc?TU_)BUqvniPGA>>K(?Id_|?|&gN;_Jbh^1p{V(%FC^YpbLEW$ zBgz9oI>V=nMyv>-JTvj=L3KqnhIGb2@-c?&xYOZn^$+S4h*6^HafnoO9F*?x&_L}N z0xOY_RI~$!g<2Y-a9!p{Lm^IiH_hTH7^7iXCy^|aE`G~I1>Sx&B(;8r)JF(uJarg)LewYnk;FuL`%`yI^Zy!ASN_dqkeV-=GKo?U~OF|c0GwenG-6;_B z)QwfZ%AvoTXdPRt$Lb+TKZzcfqj01$U)@sv02PrMQg^qtHI1P@fdc9z|Fvq|5Tm3G z$6@llsATq@1Oax9Oa28vFgakV0!?dxQ13Vx#?jCrCEicI+S7o7+KkeEKpGd0!Niki z&mh6>eyVjp(j$?*@6Wu^__IK}m(1T|Cvw=7RImZuuk@eO!vs1Tk(>A{=(}S?_4*6i zue9DcKsq&!CM6K8-t86TA1<3G#rC}Qcbr7d4eL+Z-rE1eAr$?`7yYk8SYhL`^)D#L z_w{0;?(S8QePp_T7c28@NHdrzrlak3B2WG`d;x(eQgW;7QUQhPT=l) zRB`ltobEn){|fy4dLyxl4-%0BtaYktY6%I!}Dz9OI%L_(yV#Q2L-!5wUAqrSV5KFMNp5kveA3xAw&BI?|1b#Z)YfdQ` zSl9&;=Z-@fYGbh=J4fTh-cj8%e94~Y7rYj=bW*^WRZ18ZVkO+aX) z7@aHV8i|;{*;LYCgeiXL%Me%sry@D9PDwGI)j>Bd10M~;oI2k&e)qyKeEu;;i6^I( zj2A=>g^RlPM*PR9;y8e9JT8fn!#J|5@HR6%*aLI#EfPGE6EbYyI6YN-2B&6Yv!R#) zggMR#{K-NFS<-qeQ5mSEMOK;}RCC?1{+nx+k0hD-?+H8|>FunHoakSJX`9Po($x&0 z)#)8PE6ZOCu}n^@1$=$(&JT<)tM2!~v-)C!S%2mQj!o$Yb|2<-y5zI39`G>E{Irl< z`(Rh}$)HrQ?_`^|bWee%%2{NvCeIvl9-U_WF7~zMa~g(+@dc?6)r_zv1Bez9vKYD^ zr{4O4P_Sg)9?1?5tdoqGh*`0PWEx3&K3D^MA7rulwcuf?b^CEEEvI1GH@FPk#EP03=$Mq>>3B_07I(^fv8D>X%C=?(A@Yc)IvLI|ly(WB!5fvcOmG-a4 zAzT8K88m@*7+;=uXqnbtL=IFJCN2!K;}US|;i?}HuF=wFd(|oh_VNf zC!C^MqKdlDJF9%w!reI1q%oOA^(obAh&`{4itT53lzL1pAVUndTJHb~<38442|dI9 z$3+yME&@Czu}Asm79UKM$|0rgXBc^zDba?-@Lcz`-XjIv6P8DXU}H)IGy1^4yWz`S z?u?KWQn(r~u-U?FIWAR>W}W*BR-@{Zdcz(FY~K9{HE9p3et>r7VGaXTJK)P&>(`Lut*-^DNE`!CyHz!>{RU^v0w8W3z zh?(vzYxpWAlanOmIoSvYWlh*pO!C_btMAKJ)GdA#q$?dOSo6lInTF4nn8-cIp)_0L zr3`WI1D&F@NEidCi1GJ<{1$4l-&;nm&oW5o{Ll~bvSAqZPwgPZ!z;6yJE$^K!E=fc zLN+&e;4r^yk~0L-CNp`UO6L=hW_{|*bAR=J--h5YXRU*!o6qkQB{e0VBaBG1mZa^3 z>}L!G-o{yo57Yd_Ta=TrOb8Oq|(es&^8o`rU$RhEEV`%U?k?4-|$$yXmTr`dt>l0 z1>n3ujP$p3&;~cCNRV$h1rgNvSB;%h_n_8QL*6QkQdAn(Wv6-Ek#xuiJDL5ij8SXc z{{~3`3?j9QGCiAkOSBe_b8#aMSxlcMVlU~eu~?Nu=v-z3;!TF*ogUpO0vwQJW;I)J zfT5!hm|307>7p#c=v1=xWOr^_l5mqdNXCYd9$v)d&IF+?slgTjCw6q2e!oeVg4qUtQ zRQ&Ra2QOqH5Bw~1TN5|oq3Mx*+_sq5Jd#@|wI3A3$Yy-YikcQAoandQTzhw(%>$sU;bX9 zkZ)=J=91}fX7HEZsY|jhm)Hz$c21#5D-A6&0j+|5oT+PW838BWc#L0{w}(39J0`q4N*%s=qQ~`s_EBd7Sq8wiC-ghp-_ou7X zXdhRBlUi9Qj?~cCqHGuUH+e{M=+ymUCvzW$Qu~P$s;ah7F^t2)FOVLdA{`{1MUl^@ zN&)7Df~OXDyR>zBzHTr?3Vkz_4c{_4WbvvLg&MajG9kl>F6pp)B@|Gi)a1ArDBRvFz(QBH`%LV2y)kL{ zfGt^?4vKk<+j!1tIrfm{KpZ`_5TxmEK=SLbq8sb7JcOZkML|FoY?ta@m2m`wjSRnt9E-QX||cja@WXyy9@XUOVs?rVa9 z+#@BV60T4eTK4Dtx63Wa2E`d1Uu$mkvSFgwoJW9b^l05RW_*_N<cqGt;E>+1J9L!u8+5VNtv^gSiktHaL z$j;gH37@3tl9k&CIh3Ah>?W7N#q>!UTC*Wl*-fM0PK`+;7Hy$tzh$V+|44=Xf@d>T zH7Nbq@ck~~uKu9espxZsTQ&thm)hvBZ|d;e_8%cw0-2VcxIsOmAhgL_d>SxHU1gK2 zaHIZuLZ0&%PI~qf(T9%Fc0BY+c=oN?jdBLm(l(UXoB)w%21`r(sHm+=1osWx`ZZJi z!ov&|@wr)>uGee zHrsWIUjhH@@xr^1WAS6Y{#}=qO0_Kx*oIKM+mA2tqh8VE<9*7xQMt$ZZ5U4~DlT_K z|5Q%*SmXEn45ue51=X#&tWeB|imvR8N0a;*h4R=cd3q+pCsP|Ea7kDH#B+A+>eYNM z;m3{qr(WicE|qxIfP1!aGFom~O z-ws7-C+~S8B+B48@6BIuuV0NurE!z$%y$GsZ}G^OGVj*S5qhD;EFd`9qe8<_vZT?x zWCu(w^ZZTr%jCr)4_yisOPWTezs)+mzv5)niSJmnZY`huWg8AW!yZuu96 z`u`hN9`uhL^xuuyps>kr0D$o9|J|4wz_=4FW`17gF8_&HWNiPv*=9V6pKZ!YC=W~b zM+pqvhLR7in2;M`l`31QfsQ5&h@?kKwqq|FB*9GvV~XAfZI*4S5!8p}l{W6318^4>!?dY>RUeuKoU=1*Rj2cg&v3fiE4V$Y1!LESA51C3kiRz=np8 zUSERW(WUi(gQN$db}wsn2`<~^ljQwGC{M>jpL56 zqK#-qy1KgPYHL&CQ8RF4M|X?Xxzr;}dpnJfyZvKgRD_WDcbG)cEvqXgT2J89-2|bUX0n4sPb`V&M`LlrRAk8^A8Jf?YSP1t2$=LK zqjS~|S^V=PA8G$Yx zq(4J=)&C3xCC>jseCP?k#(H>o@EAnvSA`VaaKOY;%C18Aa8e%w%Hyd4KJRNbLovlP zVNZBc>lHNCERc}6nz@x_!~yo#N?DwA3gfe9;$y?|-Z_Ez;)<{*8WSsIu|Mw!2nYmV zI1mp|lY}Iqb~K1@RqROrVxTcn>+5dRK3KheLW=f|!pBTpVPtuhP(2F$&D)YhrP4=N zu6`CJ$)Qn)Ab^LWI;f=lYgw|=OCrifoZ~4m10r%y~j`a~j1 z24mWLOyq+sUS{NCAV><6JPDwEg@fH3ASd7O?AyK_$^pSSK)0LjoMVhKR8GO;B_GUE z_6QE*oTp8O`GtjxT|;1I!d6>-Va>rvi9tncB)Umo%-G-_8u8A7!t1ZXORcY`Sfj)D zu_^}jfW?q-M)oxcWrKz72Xt0$JCal}aXG@Lv!ME#q6p%^qud2KEAi57=#8cGh{8@k z$34Ic$qL|7*Bl_-#|+({kkNXSv!@yy9`t7-r7{(RhbX{3HRKEUa2JCd4<3cUdGEy7 zYf3=MZ5ga}@}h`YbhkUPP@yi4#%Y+~3?n{V#IZ=ImnAx_PM^ZkXV=E}!7fT|G;>Cl zX)eBytS+M3yeuiIv`s4U7g>V1Qgz7^w8gKkwFY(};JaIHZ`8a$AX)qSDT3gTiNO?| zuVIZtLS+CLgo5CpogK73$cUS{dooBQNw!}`D_E!F0F~KUjYj4qN8ya!B=KOnFcOmdoaSoU`N}M!o^-va2%7!I;|5>zjSqXD)zIA`%JWM&%bKR2#XQW9g zTu{R-`ot_+jC@TkAuIGKza$)5QDt|We?H7^|v=J%BJdUCO*|Rjp zP1v>dcLcv+drV~k6sok0Lg%%YF}kc6Q7tk~5)O%Z<73hFD3n=ua|XX)!lP4BSloKn z!|HaNv`XP7NO<+km9-?Q#JmNOw%tU zsx-U$(?hF#8M70WRNWTnsaF$fR8cDhq4=IJUqYY#KoBZ8-iu8=+PpkK{1x@g28ca2 zaDUKhd^jPHsK*}1r9zbdwc1GHpYm{2Lm_%fmYS?0Hv5! zPgq|!Eh$LvhU|+ZCi=>0nOJj}veLLqQ#D_F81YAz>3BZ}plwJm*{P>0Xvc(Y@F}F2 z)ss3*=%z_>wkF-RSqpl1l})w|h>Cx;?Rq?>V!dZ&1*e2RktnW2X=6{-MPCv7J`^RG85;$-TH^jGe-ZW3dE!TMo)I2A`@9s5AM@MaJT%4p|$-AgQ=(! zE&Cl&deRteeYv?ILMu}2P`-nYk%HNj)ae#+QvZcYa?s&luznSxByDl&q5d-yE?dL2 zMsuk~Z95B^wyoG}zI*7CHj9(RE^D_#hr(x~ z>IsfpeoXQ9c97fdrXmP#Kjy94Ks>>nyw)Di@^jM)4JoA<9|g-5PF?AaVhuw=dCtA+ zedyns(Kcyj6Z(SZBNY!P`nKMt^h(@RxuIP~ijNHym==jRh1~O;-2997l)0IVS?wT6 zwS$cMqCKp6;SR~nRPETLNGZ!2LANhIlqePmf4^RiQNGYHQvzsls^Dn{Toln} zwG-}6(^9^0m~oQ{)~Jlz&HJI>G52ItTQAmrN!6_{MTUz+b1CeKr65P$7U*57-a(Isb z?ZWY*(PV-(|An3PYtI)$aPB7jxkq$H@^NZ|Yg^p$gj~zW@glAGUsJz2p$-s4!ufDE z`cviDE^fFC$70zMg;<{oJJBYY!wVKb{tFY-t+uBPDn-_Z>c5XjYBv(XxRNHgP$#Ab za_)Lq3LMe zV2obE#BEjmPVOp?-9PJ#8sk~$`j9)uOmEi8;;7cC^JR_ZpVLn(jXH){xL0+y`rCy9 zY6A`6qS-{iM}@#@HtZ1jkhq=-A3@GWn@X#cys3|clg+mZYCR-DJF%A(d*K6lUpl}! z<`L{EMQ-4AG=_4dIYw=&JFw-uU#4Aa)bvTY&!)YM1-La4EMx?R^Q5}>;$_N*zhOue zz{w>TR{Z-Z#h4(>{DuJ3@NC9=zhnV&nZAHE2cn)({@zyV5{dUKkb8!h_r_)whhu~1 z=OYuRX#(@;o#4*{_sXyi)()OYr{J2p%svpuMESOtY zos1(bY?%>QFD`Jj>Ii43@r`Y#UNiH7pROg4>A8nOPuEY|vv6BGxStRiSPDGo)}uFtve(MV8$bcog$gX!%yV zi*gVrs7FKTsxULKO7fO9^TxBn0-AL3j0O}ruLC$(XnQTp&q!U-(gdRlqDY05YTgHoX zUyAQmuWZm8hJDcma4NJ*cXu&2GpWnj0J{ zWYvPV?E#0k?%_M54;-9-&DpuhPL_3>sziQeJKDF}?HLbW$7q!)3t8pUL`qg6wS!B% zJ?JNZ`Kea}X?{%n>$vji6ZZE#LK9z9D3I&Y18q*rP^>gRvefAE z!s?H{G)(tnsM$TPMw9-V>Z+^kIM!oF5ojU&aFJs#%@(5G)cz%}xmb~h7^LD*SWS}F ztLNzq)z+hSuniSh$|o+TTlT8=H;-BH``oaDdtb#hnAeW+mrK}{*a`4z8c&d6&|tSa zZm0YGNs~d0L!>b>K5}n(mRDYgh$OJ=gxI}e#mZG3D zP(g|DX7onap{Ms_aQ{5rRvt@hQoQi>!oynl72B`>TsXbgKu44NY7iv&r7q3dUU#U_ z6T$ncDJy^?o#_kUBwUMhmZ@I-4pQb(oqdCj#U&SFS`rqBf*irX{kwR8Ikjsjx;%_1 z?{Z}%vmc=8@QKngp=2sAbSp-1u`s);nNTtHqz9KFIXDwWk0SKQ)iXCqYHpd0JHnb(nCb(;Vlbr7VJ0VCI@P@`oQrQqmnz_=anp3Ks zceQ;F=+L!o`_AIh=x~`A@My(qvo;_`A0s`F!>V3q3x=p3ijEY~l7BN>2|=l@yASv? ze7c3y6h{S|_~u30`J+dt`YakY^&8!Ktbgq%?QqFP#j+h)Yi+%c)&IlVH%3Pmbx~Gq z+h)hMlTJFeZQEwYwrwXJ+eW9Oj@7Z93Z}kq%~~^S)~xw8Kdb89SMS|-@44sfz3+Yk z>+Az(*P<4m9BKwmG!K#b+NlMv-nsg6-pT;TSc3A+gotw`ZZhpGxKO^vw1JJ_{+dVlh#1%JWq-R?t z^6WiKoFn3k@xC>_r3<_0q~3uME|Q<^tGMPND3a^Tr;p%$5+7o#xRg7(C;Xt_zD7yf zXeV~}Eg<=GNr9Da*hk2&u{kwLed}9+kKR%t)Ve}ER^RXc6Ulhh*y@;mAQgb=ZX@)B zT{>@b>Y+N9s?;ps8;axiBng_6WS}`2Dx$&aIrQ?bJ;9VcJe!RZ@WcyRpS%|OcvR&q zOPVa$ZMMDHWZIRq&)JjkF0YKQNLo!INBYr*H)HzZM4%sUa>^`kE#>?%lQ;XcIuJI# zZlD~@(*E#fOH6mTj!qxQx`E`mIC9!9?&v7^8IXqvwmPsanmc2hK7yBVc4}x%P%W}( z6R<&YkTzGO8RLgTeYs;y%A_go`-e~@|8j$~?maaxOAtp*Ja)zmOO9SV=G3y8RjzGc z(&jqRv100fn2O8f-dCCDZr?pWu^WPR)7ITsDnU0JmM)U$N}mt1 z42PmKq(&!S?*lkB`&Ul~@AC#zI5Ib3dKUSD-qlr9&IgB{N8pB1H}Fd(#19;&oINq>Vo^%C$-^Co(uuIwIXn#@J}?Rc%bralyfGgRyq|NtT0T zYdq)QCZk&U#xYI%b%0wt@zKJwk;Bd(^8&HO*pUcypf~zA|CFlCX38AJ;+7`-9FqR{ zq#Z+iDu{YN7}roXFB{2@k{H|lWcDtf2D{Hja&!N)2gZ3a3g(2)c)f<;IKpyW>4_pU zdA7|Jrx*V}JuP!=@95k)Hss{6N2#WBP&>QTn|)>Gp|76`&y=F*&Xv!!TpwpP97OB6 zY;)~{dG`}!6Nqz1nvTBUpGNd1x1o>VlxM2buDcF9=Splq7pVt8=t45MT8U=+@eySE zLeCf-G2&AKXq~q5*m&sfoBe3f2!LCcJc^Voz8%6Uqj`@dq3HJf>TN`DLJV_}P1J3p zCF@A#OPs`VH!HEZpI_Wonx@b+j#e(ooojDm5D5i z!7tFS^c3q>%glIw5D@f-#t z{xewoC3~zF{PadtDg3~NZ@Z26R=FKtPI3L*A7ToTrFS$`g}`F}Y6+d@W6DPvJ)Ysl zZ92J(Vsr)7UQ!YIclg6PHY{u8duM{QCW3+gAv*OC*k>c>X^IIvj(-3|h&GgwwZH(Q z+P{8{q~m;~{(-s2uOJbNMbxg987uszld5~NmBS?0`ar~`3`1LYrB}iWc`>A7>V+-k zgjM3su#dp#lu{Ejz28Xw3|yg|YmfWAm0K-vgAD!ZP$}_|nRNt{q-qm0%!j0ik_a$v zG)-afMK!N1)m(xswYrrI?G3$s*f8w^6Gf**;x$uZkvoX`D6UGT2xV5!_V27dfB8F5 zS5lJ|n#0PIs>a=rIW_CM*v;>QVO16ut=l8;)}ChUK}l?|QF#JQ_~TKt8k+bH?SAVK zcTvY3`Up=EM~A3Z?*}W#@&)lUUV? zcj)6or2Gp377@rQ*5newz3tdMav+uXa1%=Y@MJX(4D+o5SmtP{H&5FEU2g5)Gjemm z#-B-N$WeRA`i@gHWG-V<*}jTIExIdPK`UKbn|reRe4h$IgAa6u#*rm~qYXs#>barw z%*;n-i$;2O;|!JKH#ZxKS`K7&De&CgJT?=LZq|g;b4PAJ#?80_AT)Yoo@o)@+Zro(pcbKodjve=SBmSOcoY_Ql- z_CG};pbK_>o?V_hKYY;C?JgL7yzs5w5v{$ux^d;373|=o^1ML1(_FF~UsES(3S(s= zQSnv^zthL}09#{H-E(C+zOz@e9EUWxYO-LRcGWG)esy?NiJr1vJy(z~(8V|oq*8H% zAO$qd)?~;7GSsfD7rbOxuYp#n z!eaML_;zp0W$BWF@UBSf{zw!Qj_^!x@6#5}bgQU5--$J$%%Pe*hs9rZnK?dc|D@e! zdw@4O42OxJDCWpZX%D7i(PsJMQOoOw*UGq}PD~h&AWKe+F!-#Acy6$^uJn#C@tmPJ z?8f7w$6&rv;KJc7N!7jXQxgW9D-*8Wp~A$dSihpcP@{1fZD;#7UQj%f{%FbDJT$8# z#JrrgP4I)2|GpD8FX_HOix%Y1-7=O?nL%!*CNJK_o2naJ8-iyy0_8fji}Fv~A@7x! z9`4*hFr+?x_{66E-?j)B&j;S7mUXwQf&q*;ySopcLME0}2_NR)Gv)_NlP9Phxf2F# zrcfu*KO~!BCH(m=0wh)sa7K+8Qh3l6nx`zCEUbCiRv-qoVr`)H9D1|Qc;sv+#V_xV z<(gC@Ktpp;+84c@t0sXr`V>L*4VYe?;0x~b_?IW1u9P-YB2u#oQI6L@WXeD)X{N?w zY}^+D!yt{#=UL8^d5;b!u?O2-_T0+r&S_FMbxaUum%<=Y&--r!e>Wyb;yZo3d(}szi^nVs|s{34l32 z7Ti^_9*K_jk-l4wRC2i8s$h1KO3~mcnF6jrFbP%v6{%qsWY{I{o6>rbEBf{cAQj z7j<+u7O83d45b}(?m^8ULY-@F{KtMxp4h#hX+5qX_(P4>T}zW;)3;bNyAN9l;L0w9 zqh=TVssH!Z(-N%j0TIz$7f?fBstGCP&$O3|LoD<`R#cPf)cq}a%`fTXiFKU2K%h?& zZ_G3N75nF+b>=;39x4ThPJnAqSG%^CKG{j6u0`wJ6d>L)`S{7ljC3$-5jc3gQO3|D;4H)VhsgGR^9c`>6V%gWxl1}bJ7>l3`jCyHOMYzT^YO^L z_4yczzeK;iy>)&12%|;Be6%P};4E}AsYUo~vmw$+?T*5Yk+2vr911J)@MGPv4pl)u zdCC5l3j*wveSIr4Ss7h=^j;{|+;?nIB?#%1*h1Mn<*7caEKZuT!^%JICX&XSb6pya(EfKSt9B5n&E_VO z%zvSKe8}&M0qJLDXm9}srL>V#PH~sF}g5IWX=2Anxk^g5S&N z#YyFzkiN;usg9__bD&@TPu{K>YeiBFdi9o?W;(4mNgOzGIGMuk>(-y~egPn$kwxq(Cw>EET&9=m^p#2r%c;g-9YRdwZfEFFyc503)4*TnHql z)iDg|+{U}Re`iY4`DEcefB_4U+F+3s)MBG|+Yy@Deib5Ht5Pg69@w#_f2D-s5(uQ8 z5Nl+mUJU4H^Use&=Pv6DR_xPRP}$!Q2l8_(Kg8ta4|J>{xghR-h&W&kRhAPNDf7s8 z@!?ux4&CN{TP(=;CGJUmOkzx$;0~WKk~!xdIog} z(~c2?2x0!yw$GMeJG8{Q4R)M58!H3m(jH{$dMvP#V1r+gLjMk%wef2rr0AV~RDfAP zQx1&Hq_8;s#N4OZqDkmA>veRr=#zycM>uYIBvo7G?n8ssL!jGXM5JJl{|A?S!ugMt z9Tm(NR(gpr6!jU<#NYK-=gY`{t}XD@g5oA+;AG$AmS|^WHGJTR1JbrVfv>h4AO9Zf zcX4Q;3fhE0(9RDCLl5 z6{Np_+XVf~afe%ReAKL!M_bz*jhu*={2=Elmn|8_Gg~XKYG`t4CP}z^tJd!$uP=j)ob}5!DpAz2%5~WPv zM1h;ExkE)&Rh2q!$PsS1Lo^16kKdw!;DGgS;+UVGAGlP9UYY{7Fh^WhY0vk~2v-S%S0B8G)oV)!AGziA}TBQ$_c8oE*&% z=B^lG6Oo-|-QDKnatDwWVjZp1IqHwI6>t;ZNtI8%^u@&~_?0Hbzy;Cw-M8$=4O*?; z`3&=!Zts|O78aDqOM7HR)NF10Bcv39T%)6?qqw4^EXmUpGlH~habuty(IT9)u?|bb zeK|Q?ATa50ss2*p=gFM(W-{Gsu5#)#BOZ+Z{(}~PkIx%j$s(bY{qJY@UtNcsctH`l z?>&_@x~&4x_uhc;zxxeEN%xXcQs69eR*u3xM%6l@s#O5JLmv2hpjagOxGkuII$_G? zi`9#@W5_7WG)<@eY)IHl;%@Fwl78w?=)SduIdJl%bQNB?36Xd?I5=ELZW# z@jk_To>vz#TU10OGVfyN=F+zuz{K*o0PI26+Oymh9F$g|Ax)?iO@mLZqwqvV)A42{ zKRXnIiuz?w^=36(5HYqXDF=%tBG=c~a{pqOo7dSx3BY5&VFj-BJKI=UnE~X6vE`@D z&;h!iH8mNvlB8V-0MCER`~4APxe@XYC6Q3vZtg?@v!`fIKLFLr+N3_AEU{v;atkA% zdukWuAT-TJmT;7o+s9A{9Sr#mT-el1C4k!aL1bLU>tB|7cSlud>vlV((H-6g zk$&t1D2j`l1`PaNJBlP5#Ummbe@4F~Xu~vuZ&Jq%CTIKvb-pDhsggviL+==35N{}4 z%E;FRvNC93wIr%6c0H0@KVV_S)PV1uh>9q!6d->rFJu-pTIoKGjfG76_$IiuypSM{ z&7ls_u7Yk}intPNh?XXs#F3NoFkDT_tg9@HlY`?QgWMH`2nUHL1iW3dUD$u0%?@fh zd1KTk9C+Ml;yz{-Pml!w6v+re#QjTo!mV~HtJyNd3m09WPozlx^F8!Zmk7mTpK%!Y zG#Ss!cOZb1;|}7FVq>D!j)+`7W9nf8QV>4=D_DxP5cND4C1Uq>e+1}qf~|HEBLsGm zKYxKKiBkxR42qEcO*jVs&*LYe#R(b?gwp|ESeQW3YGtCAaNiQM|5#m^P_?=>6sJfi z!V3bOL7W|c6ekezpR4mmoCR=j+~H<}fts^&K!6&WT0s{UC5x$?$5)$slcR*C1WlUy0XGaS z3=Q_40+&gWR1c9t2|$7BlB(X09Rq@Yq~96G+2h)^=IM5h*KmuI$VSE@P-Egrv5CTCB{RuxK2Rb^A(JLvELe6>XEci|phUP0 z$BI#dNry%`Y3UusWFFxIFg2N^jI}Y~f1IJx*NTv8jTAsIA{UIyA<}7S1@$IuhinDD zS`wqg3G1Rt0h0C%YB%q+YyF2aP>JGZc-4cJ>F~rE_#)QU08-E!EWbSo#kYPg>@*R4 zT>64OVVVvL`t`>tp&?S3v4(D{j;croa6lWg&KnhzC8fdAt7%0wcd07<|lZO$*+8A&fJ5{ zRYZ}?AK(^tm`xL~*STr(mPHOnRF%3OXg|(Z$kjwlh-+S0tW}i)scWswUkJD%Eg(jE z#KJ`hy`Ky&x}KpmWSg4+G6M0jPkXWLemK+I{-{Yww6c({=qevsR;X&5D=diUPaWRG zb#a6BC04>WmaRQ5!d>w~g9I`xdPDcD8F+&|W&p0eap@86651+lkaK0d$Wm8(QSq%D zl0n<7-Lar!YA#)4lucVvp1~v~ur@fL-5{fvj+T zjBYN_xuk!g{x1-;*t+o>{RW70^jPvcN0K*rJ@uO zIpW_-oV-^sj{G|=OwB)963oj?^9Ay4UascG2|L6(MuScOBA9|P3{U-2ptMz=w58Cq zpl6BmxRkx~7)|{Z9ZwX$&{&L<=N(%`h4DE*L3p5ef>~H<6$)JE6)T-f*Vbl(^2B z>Cbjb*UKdLy_JCs0f*54-t_S_&C2y>l&NMWK55gE8oWp>H*m{QxzC8x1Pwhdk6x8& zMww3?u*cK3Q_vBR`bLGyz{0}C1DYsXu@H&@1$b<;%X*2>|I)9=%vWi?>hNNWPS;5W z)6YqUrs_zSh0KONBBrx5UuJH>#Yp+kO-nA`ray^~^;}`1>9NW9 zesj~rmbj{dlYS6^CnX7`a_2_7XS_pT*Y<{Oc123s*R%rVb8^sw5Dw5q?CelC9QwgO zE*s2e7^M+5W8;fDY~b4bPTFBJ)WpXwf(j=0orPoo(j7Ery5x$pBCE~D~^oh1?H$4`cOFL^H|ag9j~wAuF_696h@Bu3vXwPfc{9lCYVpzNffCu%LI;qcL8dhE&mbQBUd zq8Les=lbrB%*2UG5NEtKYB+Z1`URhql%IQtjN7UBE@&liRL29v$9foIqSfs8EQUSC zUSrMJEAm_dkIAO3(T_aJ`GjveX)LRl7drGjUFR-rc1{~UzW#M`k2Q3AQKnG+d`g_> zbE?TppVp&EAIk@1amjnZsqFX4lD*@6FkMDpu@fHj4&RL-*?}wmsmd{_5g{kpc)h zB@so>>vwo1XuQqa`H9A$!qnH%hl1iP{E6V*E;7k&sH762uIrGUr!@y%3#;MqN*Fy= z_lyzcn4i8J!D6Ij0?EDp$yRAs2z`}=}RyYr5nFh zJWP-B(dxU9-sWeG`bbj7h&yNc{!uNPCh8R7Aes+c1pC9(4Le(5IO;Iw>^`)CT$D89 z&wwGIt^9{+BXSw%ld<96P8O_l6c8ypCZ(*T_Y>**oh*9lytYxb;t|igXM^V6q0)59 z)KK1`JLE2_8>*~oGeFltj1;rEy3nhJ_?7*dU6f6#Y9DgKwZ(4eYHe7gmPR zqhx_8nzcX?3^5qaD@%#BAlHyRJ&F9_twciyj5dLjZe-lQNP*??XZ7lVFrIyv&f%J#iH4Dcosy33Ynz zBbXXj!R&HEZ>&6FB|4s%_plGc#)I<6#0@uD*Kb*<3Chxh1i2yG&oMlA8FxW!#~0Mq z+Fbkhv0O926S$uHpnRoH2Xs@%)hTs|&G1qyHqLn#`rf|D97bmK1KzScWxJuVH`NSW zRo^=7n{zcufPmQ(sEn$$7r5)L32@nf@#vd zNu6G3e4Evf(is>%;tT3JY8W4Sbo87F6cRPl!oRWj{ZPn*kPJ>MmRJTT*a}(i-AJ9a z2y1#9>KA3v+hq~*Cd=s#Gy(k9Ym`K#0BG3v!W9ioI*7g%{LoZxBkBD3^X@y_Lb94| zb$qJ|g^JfzZswr&h@a+a#rJ3v7ESN}3~Lq#=9DzaI>qHX&atVmj{br1Xvd89TbJb7 zGuLT-&$QCO4QL3DuzS#`)PKyE zLP@z}Rz0pq-wRK#ho!iiv~STbttKJCiF9m^yA9haEc0rkBM?|=JyI{Hj*YvUnXzwX zxXgaTsdv2)T8~&AlBV?Fh9h;}18swa+4NvPcmMgz`_;QZ1uHFp5h3FT$u4kd%Q~WTt+*V7(bS2)PK3*mz#k{-J6r-u!M|_XtIl>xUENswxQBfU9TLI z^0(zpg%hL|d7ztS!yt-4eIT~HXm>w=kBnVN<-gaDgU?ZxlV60f%DAFODI#afya((% zQzun+$@M{>Irs1PB-{>Z+Rns)S?XLDFjy=($l1?7Iew9Wwx>#S3g@K@)p|S}=8Cy< z7w4tJ#;PscK~)$Jo=q$D8BsMzs{b;rW}Szg#A96lqGia;j(anQxzPkS(zirJs$u@# z(UI8wELVHNzopMjB;5n&PzY7BeZa&57TnQgC!1bgGJI2-4HX~@SZaY&LVO!(Gg!yZ zkhAi(C~S8}G4MSsK*PKGQFMEP*$Y<;AMT(~92-x`8+@mrSp5SqSl9)V znk~S$FeynS&kn-P?wHV->O~t#Cv2x3#Hw}T_yf5Ke16^d**A~w*jwJIN;Yj{3~Z10 zO}fh6XRqrkZBf9B2R|Q;yIsRN_fFga)=_szQGCOOFNG5YK{!Q|R>CrHLM zu2C@`1Kb;;cm^_F$djfT$A0Kep2V$I(Q(+uN7Oc2z(mAYI}{5w>~$DmWr-9P4RUO3 z5wDY>1}pUq$?NC6?U`aR8(@J%7IMdV5_m&GbSIG@RU7FR*uiokpgUsyL|_5$v4yOC z{^^roJa5<+alrhEqoMyI$*_JSWNyda3vT}&ve8-59B7vOLgeZ=hDr~=I}qQ!=xx?L zr9B~~YcF%O0Pl2DMPdXBq2##b3bIiLZ4ETy&&gfdFhNSj>UvaD50|Wd8y}{owAEHp z+FN|_K6jd5&ulMAw^0rPk|sz8ouF-b#{u_rvB?)`gcqUeGvie7llT+PS&#IdeG^OJl z>98lQ_l_+tGHUcvlCyOG&!~}+dlF2Z#)F;p6Z0^5zxzO%^C*^0U$bmyo-Dj?cm*FJ zis(TuX=&W~3Mwu0a3~Ill8j>Mo3pSUThDZ$Qn9dEAVtRk2<@Lpx$rHN4?-T5S&==~b=hoQKP7C=PjaYV%wmeGJjB#_EBUgXU zG-8nFU+~oBdi5_wdfriH3nOEnJn<;M)ZkyhB*)^TBSZ6%ONp8AzZoQfrx|M>C$q3& zjKcS&O|MND8#h3`NlJjxHK^RM%X~XJlB!`a4g&!&nbhAD!i^PsuRhd5{fq!p3m6Ox zs^$qVf8RI#sa=ojr!xH>KAS2=H9R32mU zM+AKaR*Xc`^KH(->n+I8ZTYp*_FA_8OE(rtSvkIHoTq)yLXWWBGqGNfOCUrr!JmTW zuPN_0idCjwSaWyT&a4VUI9}&Q1^70ZsMjGtrJM`Us20)ihbAg!s8cqo|nS}o^5@sy&Lj}3yhJA-Q4@AF2-5O#({yw(_n_-B~b&Ug{v#6gaX#Rsb7Y- zz*X4@lBmIVMNc?!k8cQJVGQF@P)x>6D_N~PueS)r`a zZWevxc5Ry@lw9kb9FG{h7mR_6XJzRaMqL;uyJ_seJIVN#Ujx`?|xTG1x;+D zTkiWzv5>|UNUEDPY|Z{6k0G|!>o4~BelL=AyN;>qm|gX(pZ%OLxT4L41-O<#qQF<< z+_ih%u*%(0Im8ByjhFrEGA-a+Lt$yN&h4ePLKL2A*gSeLbCj?{Ta~kgqHJ@+CDxN1 z6ap;+9~TL35L*vi4w#uY5r%49?31}SZnffjpFMYp@iG-G7P_bxV{50x`_);73lPb4 z=YYGy43auji-Rv3RMg^+VlCqm;mgW$>w^uKok;IH^X-*^S1u;d`N` z=Um%ab5C4sW7>A3>nMnH-G!ZU)YIUcjo-#=@c4R$djoTU;z7-uDoKE_;56O-ASLCb zQQCv+nL9H5UaV7;`FuXEaPlHw-GWi2c`_p#WY_wS z>aKmLctK{`;oFSB@TU*O#vD66c*imAxbTJN6Zbqe-5(ZKe^ijn=o@X$ zarFJ}=U!zVjfc;9^lv=mm)Og`;vXK_APUzaz0(m(MZj<{wt~pTQ?5tt*H@-TrKbp1 zN*Y`9V|*z5?#nlsm*wGLY2w4o(xL2`EoKyR)RIGLVzS9Z3UvHj~Q&&~GgUq6g zvoL1ps|2K4W8s~FhMmmxV|Iru1q8Mh^LeXzAv{i_EuCg5pgx<9wq-JA%8f%c!KsNg+$X_L`Lx~Cvh$ld1|B^3H-3+rFTr7hr2rEYWQJP!Mrwu5 zm%u_0jE75fr3Qz~yNg{KL1_;pZrKc(4B7rL;Mo2hnOqHi!t=lo-+SX)Gk7$!6)+fr z4uU6R2=TbHoHpZKv4%#Mj?_}Xc^)1V7o5Fv)KjVXnXC({H(rE_zIt{u? zQ6QS(LvaVm?YxekJ5ABN>D8VK)|qP8{S3=`e$S!CD4o?9y0T&QlqTIi&tyh{QUv{V z9~CzsXMqQjO?qyb+m}p#62d(TkyqSOy)>4H;<-@YI3{}jY%%Sp8f0<$cd5)cy^_#g z|A26g3!nqYO6IEuwdmOamo;{LT*@18-D&-!GPXHd~F=lj1uI5Rl0}1vsk)FWXQ^g`@1E%WGK5 zPGKog?s>o2F>x!@ugceEKtDItzG11@LvHOazX0?Zw6?EJ7z9^F^Y8=DHk{7NzA|u} z%sPJJu(E=0N7aJ7HUcuHekh+iIWQ7Qnzd%QB3a-V8o6ZN^j+=@Dml_*EdC(=buzBk zg_ifL5(2y=6e4#kGdf4p+ajXrVl$znC!nc>Qj-lhu4e?EIRM*1D#sHfm=J(q?;F_g zhmu4kAZ74o^@b~Gu0)YXuWS3N6ft(dIrjt~vGG?{=I=8Ep(w`HuXG&Kjz)A4+>b3k z8NnLRVkhemYnTxKczaw4GtlfR91J=pB1dj)ZItJp&calu5*32T*Xd@GM9aRqJUO0i z6f${-f`8+BK~-2vQP#$xU&{>l2mu7Yt&@l`Ts_4ElJD`}@~o0>3My_wutt_J3k*mZ zfZhdXzkj@_zRH*y&<4|>?}0Yw`^Ajzm5@P1n!^3p-?)alytM=Zg6R8V+t>VwzymGD z0c|@B$!=c09TX)UX6m2fRu4{_bc3L`w2Z>it}I)Uwo6}p#m&cfZPap?nxuHIPj{4J zKT(sWAHw>f#IEMQp7783;_cfFqnq}a%*C^kjtt9y`HxQ|JkcdQ`Yi^mM4iyqg57m= zXEA6Jt4YU=_w}B11aOSWgeNF_1Q1H3>V>GshR;f3kLv9?7vmucJrB3x^7Fw)K}#HT z=A>)_6Y|0`BMFk@sIU=e^pzr_+7v^QRJALK!6|>>x|#+zA1B)!W}q?0mlF z$>gV&Jlk`R>yHen_4})l%>WqcPpl(SKZ$?-jzqGH(jlY z0=jX{vev1Ex3dpWz!GB6a!pe2_}wre>6kXmbhqw&LkC(}u2Q4@ss&!eYXACRfDaa` z=YPwZO05}j1aa3A@5)0_?h0%}W+Gy?OyQolG)*jkLQ@a$x#_sf11j8XcqaI;65bDSKaLnRfGr>19riqfdhA$-+|PWgJ^a`$^2Ky!Ntd^`L5uzN6*)7#?|+Y zPvL5KS#~z7#VcGvZ&KEp=6bmO@FJnmWRML-H_?@F^53?6$aFj; zsmy3fa@_}G!zUPjpa)V!7m5z!t&8pPJU+xOwsw(8?k14MM^On3a%1%9r}8wysJ6#%T&9bs*OG2w_@Q%pftI%2N7$QRBmFhJIg~}Es(Mc*0j;jGkmAtD zg8l?=3O%Ld>ncvbwB>>j(0V4ZuCTA4ygA02;+tqqP1-v@=#2`^e!P{i83HQhiD1$e zb>^Ww3vilMkcMGF<9981xZB}i%gjdXIkcMw-!+%pxBA|<*AWk6lGJNZp0-+VL_b6o zjcQcq*b4_Q&5~b%?0^nW&8OJQj_jG;!+${|xRzh}d_#)#k@j^&plR`=z=c z`|Nj!pY3LXCf5dyIAz<4Umt2}y#l%0%kR4^?j};FXfMCrcxhq@U-I6<$M?U>LLz)) zNF(Le^PfyC^U)e%4aFt0G8KLuiSAf$1mj8S2<>8pVm>I^X!;RWJlbb=@T*e0#~T}3 z)CD2E`0*DE$R>)Ub0fYTjWezDzKw2eJ>U|?WB(IBT#>4h_{&Di$%0e@a3Cec@sbn5T)-U926OEu z=vKe@Iok~xqMe)>HQ$;HWgBcVD(lULSZD>Pkbs{nOuP^=bAH0d38f|e>mc>aoK)6# zkF9Vc<9f{z_m(%BA^os6LyB*Fm*|pMvsDC;lejnxM(w*st1>@z7i?#ive?_bHC|!K zjf_hBae!^g5GlK{*I-p5n7?~oW}Zt-25lt1kMDoFbnTpa$q}knb0wY**veNwieSZR z=04M5sxv9Pe!fN3exq0W7UXwG3H6XCV75FY+fy{LP@e?n6%#!LWl`K?%&KA6m$YR} zcN(1=rWyn)@_8EXg^B9_th2~^0ugGM$bumhKLP$UhOL`A>?{tqoC$^1r*^geA77AV z{Xb)dV6mW4>3=MhEGVo#^~FDkQVN)w_`|WitZ*8?Qqx-s3Bd-g#Zy!#LCE( z&e*!n1Tm{xy_86xbk1|W0r5~Z%yJV*^AAX~kUgU=SZWvp^@jfF-wj{1r$)-?@#A)L zZLh?Zy11#$5V|m)4ngtaqGO}MeuwMgeSMj*hqIerL1Rd*OEX7Zp|-G;Shpb%H~i?a zI`t(CUZLeS-fQr@{o<9P0dRA;wd&$onnj@SA&N{#`{SY_Eb5r#h2w1l+4*+lwz|V0 zKUgm!Bh#vvhU!1KuR?UvrjX#TaG4nU`4SK$!VV6N(b$n{kfE+P|DpHdTVK#Tr}(C#~JQ2SY2%6YR@l0lu9$Ndc-c;SH4NOV^P$hnohJP9!}3qQNn*C&F})x-vFIu~13tC>ai7YX z?lEk$?^~N6z9d#m8fBWP!(gr{022LNnnvjMFND|Cr(%udq}+haLzF096gQ_PuGl`P z#w1cl83@@&k4KgJz?@=~&dYeR?+-tJ=&X@ZWfsCmp?W9uyVH13g*rw}YnV#w%}?-b&B2%;i@ZI+<0};P--l4E^sDkB6-Va`PbC0QlH?F$$_Z zt&W-$$2FvC2ztM;x%mu-f>7x#+m3e`xKQ;av3!9#aQzCt_Z-*rk4Z9YsxE zXZ|xM3q5$0BUCRjs(liJ4h|&#!XAr=Kv$`=r<@CCtd2LiF8Lbjg>w}iGlBP&o;SYO zc+%&xqHf5i{OxAqIfk#S()#@ysQGq6z4}eu>7SlN+ zwuUXk^1Z!xBG2a%7lZ)laC3RRE5VKAm0S}5q{A8>Y_;3k<<966f4#)`U|ueo)FTwl zS)IX{C^Oc8yj%esIz(!69?dQP!T2G4IczgXDlxt=??uP}t;)Va0s2d9k0PHc0A+Ua z(boXRS8(vtR;}G@F-bhg{XV z&h)@|x)i3e-NFvt8zwj6ZSzhj8uYfjgoUMM0uW0h#Jv@u8uTx|7eDk*0yADw45C2d zja(b{R6Ix1LoP~*-{7gXC&HXO^se4vkxBmAeliA6=AuQQrKU z6UA8-G3d>$eDe~lf2alEje=P~2-!R+K?`MP>K3fp|83QOgza_}aEo`?@4Ifa#(KON zu;hw>T~cwx%VawDlqmC5>=yMksTMNXmOs=CUmst(V)^tZh;Rxz7b&$Syn{~OYBrfs ztM3%UO3R;)1~W-nH<@^%7nmyn`#*ZS^M9z?HUQu=45ndXM#xwq%D!c6F-(@ol6`3? z;=#z48sSMAOp~EO5)&Ci6vi44S}bJ{k$o+Di>!}C#`>Ns40A6(kg#NmgbmS`mS6U-1$lq#nT+4$y!`=J zJ8f_o1lzRv!a^ai-D&Gpku5xZl?x6>($n20Znp2RPo%u3!(B5ROVkK4*LdxFr{<@n z&abd@EdBIe%Ut@EaxbbnSQ;~#;3EN)3!a%ojJ357H69-g`=;L)PVhhft@K&pFzYIR z2K_qchv<*pOAlOE>}OiWCW6!y;~&T(OP;?5-p&0~%)KsYfOO7cF!^E;h)3yjvLo(HmB)b$7d#HA5=s8TY%)xl`Xki@dl+sPg6J8?!dbh*W}| zLxcFIzp_bHMTrXD#*B+2v+qhAs$fGKkRFEFd~{J`kBuo@y+ztorrB-;EWB#FvWIcq zl#mGWPr~@F7gzXsi@11St*_^HH~cAJ8JMjxIPm*(M)Li}L0o2!R?*K-F@t6GN3$m* zbP58P@nf9lz)nq!rX0)iiy!9JvlY4nxz%G4SHIAp){0hK3`PyTta2zxJMY>Iclr=L zF0TJ{vH~MT$&azpO8R!LDR_;iy?XD~xNi~r-0dBv$4&~A4hu{^T)Vbv|Lk*QVGdu? zlqGDwHH|tl_c-FV7*KfI^rD47%HgZ`yHG{DH@fkoevRbYRMOSbo%Bbb!H<}%fDLI z4}PN>Tj!LO;_I|8ykz_t(Gqm-*or=RhW_N}f+1-?c|?8iIz)z3j(xpmR6gd+)#L_W z$j|#9mFhe-fQL%wrI^pT>e_>k9+)Yf;(8U03+Pq^>LU$Fi6zw`cU;TQ#LmwP(CgPN zlL;pRdev@P(=|XMepnapfNSSe2kwRktIBe=#HLxZ0EcxF9rLZhV<< zL%h{us%ndShUW(jEK7vP&TTiUWN6CO(ub;iUb^+@C=0c)m63eJ7uv1ok3~wxE&fXR zN?UkBBj&PfE4v&~VcuWn)-o@cqd9~FY1ZfrN4XHFQx}Kc;a3q@dK@*hb3V)J9hp!h z+MHfVai?5a=Uo4C+Mzv~8ugB8=LLsT$Ikp;CB(n21sQU~-M2Kn&;m}~CCX;WjXw(! zYS>J=Ael}klZ`4DJ$|JDKV4)3@t@_aO=#Y)hEANd0;mQXe8m%Lt*)KvABC(Pbo6 zuuQO9a9NPkt3=0Z7nuk+6MUB|G!H+qtw!hdvS8PveOhqv-d1EhCL74x zRNFAYfUL3K)%lnJXrfSELjePgtN9YmId9cTdthM3^-^eN0}(j1WQ|Uw|1|&iJ&vmB zvVOFJo;>6Ct?2RR&wvI9%8|@38%ZCxkfOxCq3|td!TQW0E)^~y@^Dr{2IVQGHh3;~ z@2UHI1(dcGduwS*7Z5?GKu<3xJ(cUbew>pb;Yqk5d7DLI-;{;`;lhA$U%k3b#6QB1 zdxHe$$28gP2{Qu@o%V}XL=u=JEc-==wR$D=%GQ9vRBN2Cjc?9BZ zn8?Lv;&uCetg@V3VzfD2hE#T+NV8fUI%ykOfF@EE+b`I4jM!PT3PNpe|Lr71OjiWW z%{f>C(YkN}7){VR+mvZqJ)kjd+X_;4o}Q1vPRjEw3lH`J?F)`jJH>>$|4iD~e(K1X z3N;)Zn!J`R`k?Mm3qyAnzui`vmv^7r^f%F?xRga6DCjJH7Y6%I7>OrL%G<1)NwaEV zJWNblbQ+8-YR;igKb*{kaY|u~=>}2P>|kp^BbbLYCkAj1p{vMaeX@Ng`-*HT2G~EW zefA!@GD-rfp`ss49cF)uo%Y9?wA_|A7Ws!3-nd=R%R^iS6OIFbkrz>+P=w(`q4te& zzKwkOW=UKArCHDVp(H-yo0a4_BeV@$LkVEWz!Ev27-7*CHF(6qJ?eV#4UT?mApgmN zM!=>M>lEe{k(fbs7JtF>L-WEuD3mCAD=anzEnw7-EfSOkE6V$Apn6q};nbhTeHmEg zi>wqhZuOz8-G7B<;U8a9pH2ZF%inaYN6oj6#2#MR91i|26;ojEVh;C_`DJ{R3yZ9l_B4vA&UfnY!fZYYrOA`| zO$OzSON4ux*7&m71Hy^96c9a9%Gf!09Zr^RI&@UXA*)M@(3?tbL*KY{23a!}m^I5g zA<N*)axeXLDl2ZaT{Y;VXxGBR z*E{{Go%(tt^Tq1m zXmo|h$wpO(>N9DJj*%i~PO1TN1L0JRMmo&a^*3j}w3WQsv3)P}PQ>oX+WKJPesOtd zw2VN#utTH!(X(z@K{AzU9#&ka_24=ltx2R)`2f0IiiN>0C70I@8@c7KV+su2A%2;n znPC)c=c3mv4xx^kceYaO?ZWy<3Sc;1f8-sX{119gmhk+8*?6{=(y7gHDsN>xb!Zl(ihxG>60`*H zNaISJbq^kn=e7f!VZ79N62i|fCTCf)NNmW%~}fe4Hjhx33IVONz@t>t8I(E1G&NZ{20<+y7fkY r7Zj;4AYcxoj>ZlT59g68MlY2;9$lXJ`v7c&diWYMFcJE{Jp=v)+0LM2 literal 0 HcmV?d00001 diff --git a/CVRManager.csproj b/CVRManager.csproj new file mode 100644 index 0000000..b0b9bf8 --- /dev/null +++ b/CVRManager.csproj @@ -0,0 +1,31 @@ + + + WinExe + net9.0 + enable + enable + app.manifest + false + CVRManager + Assets/app.ico + $(NoWarn);CA1416 + 1.0.0 + + + + + + + + + + + + + + + + + + + diff --git a/CacheGuard/0Harmony.dll b/CacheGuard/0Harmony.dll new file mode 100644 index 0000000000000000000000000000000000000000..eddef5409fbc1507d19e2b77a1651e88ac430ec9 GIT binary patch literal 263168 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 z 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 CYk-#k literal 0 HcmV?d00001 diff --git a/CacheGuard/Mono.Cecil.Pdb.dll b/CacheGuard/Mono.Cecil.Pdb.dll new file mode 100644 index 0000000000000000000000000000000000000000..9227f6db0bf46d7494d3c675c5d2b6e007d9995e GIT binary patch literal 86528 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 Z-~Ml(rMTgK*XIB2bNYWW`2Rr-{7<+s*ku3! literal 0 HcmV?d00001 diff --git a/CacheGuard/Mono.Cecil.Rocks.dll b/CacheGuard/Mono.Cecil.Rocks.dll new file mode 100644 index 0000000000000000000000000000000000000000..a77ac871e5e6cd346c7c2d9a24bdda7d046a1a04 GIT binary patch literal 27648 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 literal 0 HcmV?d00001 diff --git a/CacheGuard/MonoMod.Utils.dll b/CacheGuard/MonoMod.Utils.dll new file mode 100644 index 0000000000000000000000000000000000000000..511f56fb1a495ab427c3ea517701686f0e6c69f8 GIT binary patch literal 188416 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 Installs { get; set; } = new(); + public List Mods { get; set; } = new(); + public List Unlocked { get; set; } = new(); + public List Hooks { get; set; } = new(); + public List Accounts { get; set; } = new(); + public List Sources { get; set; } = new(); + public List SeededSources { get; set; } = new(); +} + +public class GameAccount +{ + public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8]; + public string Name { get; set; } = ""; + public string Username { get; set; } = ""; + public string UserId { get; set; } = ""; + public string AccessKey { get; set; } = ""; +} + +public record AccountChoice(string Id, string Name); + +public class SourceDef +{ + public const string CvrmgId = "cvrmg"; + + public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8]; + public string Name { get; set; } = ""; + public string Kind { get; set; } = "github"; + public string Repo { get; set; } = ""; + public bool Builtin { get; set; } +} + +public class HookDef +{ + public const string BeforeUpdateEvent = "BeforeUpdate"; + public const string AfterUpdateEvent = "AfterUpdate"; + public const string BeforeLaunchEvent = "BeforeLaunch"; + + public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8]; + public string Name { get; set; } = "New hook"; + public string Command { get; set; } = ""; + public string Arguments { get; set; } = ""; + public bool BeforeUpdate { get; set; } + public bool AfterUpdate { get; set; } = true; + public bool BeforeLaunch { get; set; } + public bool DefaultOn { get; set; } = true; + + public bool Runs(string evt) => evt switch + { + BeforeUpdateEvent => BeforeUpdate, + AfterUpdateEvent => AfterUpdate, + BeforeLaunchEvent => BeforeLaunch, + _ => false, + }; +} + +public class UnlockedBranch +{ + public string Name { get; set; } = ""; + public string Code { get; set; } = ""; + public string Key { get; set; } = ""; +} + +public class InstallInfo +{ + public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8]; + public string Name { get; set; } = ""; + public string Folder { get; set; } = ""; + public string Branch { get; set; } = "public"; + public string BranchPassword { get; set; } = ""; + public string LaunchArgs { get; set; } = ""; + public string LaunchMode { get; set; } = "desktop"; + public string AccountId { get; set; } = ""; + public List Mods { get; set; } = new(); + public List HookIds { get; set; } = new(); + public Dictionary> Deployed { get; set; } = new(); +} + +public class ModAssignment +{ + public string ModId { get; set; } = ""; + public string Version { get; set; } = "latest"; + public bool Enabled { get; set; } = true; +} + +public class ModDef +{ + public const string MelonLoaderId = "melonloader"; + + public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8]; + public string Name { get; set; } = ""; + public string Repo { get; set; } = ""; + public string Type { get; set; } = "Mods"; + public string AssetFilter { get; set; } = ""; + public bool Local { get; set; } + public string Source { get; set; } = "github"; + public int CvrmgId { get; set; } + public string FileName { get; set; } = ""; + public string Author { get; set; } = ""; + public string Description { get; set; } = ""; + public string LatestVersion { get; set; } = ""; + public string Category { get; set; } = ""; + public string Status { get; set; } = ""; + public string SourceLink { get; set; } = ""; + public List Releases { get; set; } = new(); + + public void SetReleases(List fresh) + { + var keep = Releases.Where(r => fresh.All(f => f.Tag != r.Tag) && (r.Snapshot || Source == "cvrmg")).ToList(); + Releases = fresh.Concat(keep).ToList(); + } + + public string? LatestTag => + (Releases.FirstOrDefault(r => !r.Prerelease) ?? Releases.FirstOrDefault())?.Tag; +} + +public class ReleaseInfo +{ + public string Tag { get; set; } = ""; + public bool Prerelease { get; set; } + public bool Snapshot { get; set; } + public string GameVersion { get; set; } = ""; + public string LoaderVersion { get; set; } = ""; + public DateTime Published { get; set; } + public List Assets { get; set; } = new(); +} + +public class AssetInfo +{ + public string Name { get; set; } = ""; + public string Url { get; set; } = ""; + public long Size { get; set; } + public string Hash { get; set; } = ""; +} + +public record BranchInfo(string Name, string BuildId, bool PasswordRequired, string Description); + +public record BranchChoice(string Name, string Code) +{ + public string Display => Name; +} + +public record LaunchArgOption(string Flag, string Description, bool TakesValue) +{ + public string Insert => TakesValue ? Flag[..(Flag.IndexOf('=') + 1)] : Flag; + + public static IReadOnlyList All { get; } = new[] + { + new LaunchArgOption("-vr", "Launch in VR.", false), + new LaunchArgOption("--force-openxr", "Force OpenXR for VR sessions.", false), + new LaunchArgOption("--no-steam", "Skip Steam API initialization.", false), + new LaunchArgOption("--safe-mode", "Load the default Hub world and avatar, and disable OSC.", false), + new LaunchArgOption("--profile=", "Profile used to save and load the autologin file.", true), + new LaunchArgOption("--affinity=", "CPU cores the game may run on, as a hexadecimal mask.", true), + new LaunchArgOption("--content-cache-path=", "Use a different directory for the content cache.", true), + new LaunchArgOption("--allow-aggressive-memory-clearing", "Reclaim unused memory when content unloads.", false), + new LaunchArgOption("--disable-videoplayers", "Disable video players completely.", false), + new LaunchArgOption("--disable-vphd", "Turn off video player hardware decoding.", false), + new LaunchArgOption("--enable-libvlc", "Use LibVLC instead of AVPro in video players.", false), + new LaunchArgOption("--osc-listener-port=", "UDP port that receives OSC messages.", true), + new LaunchArgOption("--osc-sender-port=", "UDP port OSC messages are sent to.", true), + new LaunchArgOption("--osc-sender-ip=", "Target address for sent OSC messages.", true), + new LaunchArgOption("--osc-query-prefix=", "Prefix for OSC query parameters.", true), + new LaunchArgOption("--melonloader.hideconsole", "MelonLoader: hide the console window.", false), + new LaunchArgOption("-screen-fullscreen 0", "Unity: start windowed.", false), + new LaunchArgOption("-popupwindow", "Unity: borderless window.", false), + new LaunchArgOption("-screen-width 1280", "Unity: window width.", false), + new LaunchArgOption("-screen-height 720", "Unity: window height.", false), + new LaunchArgOption("-monitor 2", "Unity: open on this display (1 is the primary).", false), + new LaunchArgOption("-force-d3d11", "Unity: force the Direct3D 11 renderer.", false), + new LaunchArgOption("-force-vulkan", "Unity: force the Vulkan renderer.", false), + }; +} + +public record LaunchModeOption(string Key, string Label, string Arguments) +{ + public static IReadOnlyList All { get; } = new[] + { + new LaunchModeOption("desktop", "Desktop", ""), + new LaunchModeOption("vr", "VR", "-vr"), + new LaunchModeOption("safe", "Safe mode", "--safe-mode"), + }; + + public static LaunchModeOption Find(string key) => All.FirstOrDefault(m => m.Key == key) ?? All[0]; +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..f45863f --- /dev/null +++ b/Program.cs @@ -0,0 +1,16 @@ +using Avalonia; + +namespace CVRManager; + +class Program +{ + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .WithInterFont() + .LogToTrace(); +} diff --git a/Services/AccountService.cs b/Services/AccountService.cs new file mode 100644 index 0000000..da20077 --- /dev/null +++ b/Services/AccountService.cs @@ -0,0 +1,58 @@ +using System.Xml; +using System.Xml.Linq; +using CVRManager.Models; + +namespace CVRManager.Services; + +public static class AccountService +{ + const string ProfilePrefix = "cvrm-"; + + public record Found(string Name, string Username, string UserId, string AccessKey); + + public static string ProfileName(GameAccount a) => ProfilePrefix + a.Id; + + static string ProfilePath(string gameDir, GameAccount a) => Path.Combine(gameDir, "ChilloutVR_Data", $"autologin-{ProfileName(a)}.profile"); + + public static string WriteProfile(string gameDir, GameAccount a) + { + var key = TokenVault.Unprotect(a.AccessKey); + if (key.Length == 0) throw new InvalidOperationException($"The access key for {a.Name} could not be read; add the account again."); + var doc = new XElement("LoginProfile", + new XElement("UserId", a.UserId), + new XElement("Username", a.Username), + new XElement("AccessKey", key)); + File.WriteAllText(ProfilePath(gameDir, a), doc.ToString()); + return ProfileName(a); + } + + public static IEnumerable Scan(IEnumerable gameDirs) + { + foreach (var dir in gameDirs) + { + var data = Path.Combine(dir, "ChilloutVR_Data"); + if (!Directory.Exists(data)) continue; + foreach (var file in Directory.EnumerateFiles(data, "autologin*.profile")) + { + if (Path.GetFileName(file).StartsWith("autologin-" + ProfilePrefix, StringComparison.OrdinalIgnoreCase)) continue; + if (Read(file) is { } found) yield return found; + } + } + } + + static Found? Read(string path) + { + try + { + var root = XDocument.Load(path).Root; + if (root == null || root.Name != "LoginProfile") return null; + string Value(string name) => root.Element(name)?.Value.Trim() ?? ""; + var username = Value("Username"); + var key = Value("AccessKey"); + if (username.Length == 0 || key.Length == 0) return null; + var stem = Path.GetFileNameWithoutExtension(path)["autologin".Length..].TrimStart('_', '-'); + return new Found(stem.Length > 0 ? stem : username, username, Value("UserId"), key); + } + catch (Exception e) when (e is IOException or UnauthorizedAccessException or XmlException) { return null; } + } +} diff --git a/Services/AppManifest.cs b/Services/AppManifest.cs new file mode 100644 index 0000000..0ab01a3 --- /dev/null +++ b/Services/AppManifest.cs @@ -0,0 +1,58 @@ +using System.Text; +using CVRManager.Models; + +namespace CVRManager.Services; + +public static class AppManifest +{ + public static string LocalBuildId(InstallInfo i) + { + try + { + var path = Paths.Manifest(i); + if (!File.Exists(path)) return ""; + return Vdf.ParseDocument(File.ReadAllText(path)).Dict("AppState")?.Str("buildid") ?? ""; + } + catch { return ""; } + } + + public static string LocalBranch(InstallInfo i) + { + try + { + var path = Paths.Manifest(i); + if (!File.Exists(path)) return ""; + var key = Vdf.ParseDocument(File.ReadAllText(path)).Dict("AppState")?.Dict("UserConfig")?.Str("BetaKey") ?? ""; + return key.Length == 0 ? "public" : key; + } + catch { return ""; } + } + + public static void Write(string gameDir, string buildId, string branch) + { + var dir = Path.Combine(gameDir, "steamapps"); + Directory.CreateDirectory(dir); + var sb = new StringBuilder(); + sb.AppendLine("\"AppState\""); + sb.AppendLine("{"); + sb.AppendLine($"\t\"appid\"\t\t\"{Paths.AppId}\""); + sb.AppendLine("\t\"Universe\"\t\t\"1\""); + sb.AppendLine("\t\"name\"\t\t\"ChilloutVR\""); + sb.AppendLine("\t\"StateFlags\"\t\t\"4\""); + sb.AppendLine($"\t\"installdir\"\t\t\"{Path.GetFileName(gameDir)}\""); + sb.AppendLine($"\t\"buildid\"\t\t\"{buildId}\""); + sb.AppendLine("\t\"UserConfig\""); + sb.AppendLine("\t{"); + sb.AppendLine("\t\t\"language\"\t\t\"english\""); + sb.AppendLine($"\t\t\"BetaKey\"\t\t\"{branch}\""); + sb.AppendLine("\t}"); + sb.AppendLine("\t\"MountedConfig\""); + sb.AppendLine("\t{"); + sb.AppendLine($"\t\t\"BetaKey\"\t\t\"{branch}\""); + sb.AppendLine("\t}"); + sb.AppendLine("}"); + var file = Path.Combine(dir, $"appmanifest_{Paths.AppId}.acf"); + File.WriteAllText(file + ".tmp", sb.ToString()); + File.Move(file + ".tmp", file, true); + } +} diff --git a/Services/AssemblyReader.cs b/Services/AssemblyReader.cs new file mode 100644 index 0000000..1108499 --- /dev/null +++ b/Services/AssemblyReader.cs @@ -0,0 +1,70 @@ +using System.Reflection.Metadata; +using System.Reflection.PortableExecutable; +using System.Security.Cryptography; + +namespace CVRManager.Services; + +public record AssemblyDetails(string FileName, string AssemblyName, string Version, string MelonName, string MelonVersion, string MelonAuthor, string MelonLink, string Sha256); + +public static class AssemblyReader +{ + public static AssemblyDetails Read(string path) + { + var file = Path.GetFileName(path); + var bytes = File.ReadAllBytes(path); + var hash = Convert.ToBase64String(SHA256.HashData(bytes)); + string asmName = Path.GetFileNameWithoutExtension(file), version = "", mName = "", mVer = "", mAuthor = "", mLink = ""; + try + { + using var pe = new PEReader(new MemoryStream(bytes)); + if (pe.HasMetadata) + { + var md = pe.GetMetadataReader(); + var def = md.GetAssemblyDefinition(); + asmName = md.GetString(def.Name); + version = def.Version.ToString(); + foreach (var h in def.GetCustomAttributes()) + { + var attr = md.GetCustomAttribute(h); + if (!IsMelonInfo(md, attr.Constructor)) continue; + var strings = attr.DecodeValue(new Provider()).FixedArguments + .Where(a => a.Type is PrimitiveTypeCode.String && a.Value is string).Select(a => (string)a.Value!).ToList(); + if (strings.Count > 0) mName = strings[0]; + if (strings.Count > 1) mVer = strings[1]; + if (strings.Count > 2) mAuthor = strings[2]; + if (strings.Count > 3) mLink = strings[3]; + break; + } + } + } + catch (Exception e) when (e is BadImageFormatException or InvalidOperationException or ArgumentException) { } + var fv = System.Diagnostics.FileVersionInfo.GetVersionInfo(path).ProductVersion?.Split('+', '-')[0]; + return new AssemblyDetails(file, asmName, string.IsNullOrEmpty(fv) ? version : fv, mName, mVer, mAuthor, mLink, hash); + } + + static bool IsMelonInfo(MetadataReader md, EntityHandle ctor) + { + if (ctor.Kind != HandleKind.MemberReference) return false; + var member = md.GetMemberReference((MemberReferenceHandle)ctor); + if (member.Parent.Kind != HandleKind.TypeReference) return false; + var type = md.GetTypeReference((TypeReferenceHandle)member.Parent); + return md.GetString(type.Name) == "MelonInfoAttribute"; + } + + sealed class Provider : ICustomAttributeTypeProvider + { + const string SystemType = "System.Type"; + public object? GetPrimitiveType(PrimitiveTypeCode typeCode) => typeCode; + public object? GetSystemType() => SystemType; + public object? GetSZArrayType(object? elementType) => elementType; + public object? GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => new object(); + public object? GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) + { + var t = reader.GetTypeReference(handle); + return reader.GetString(t.Name) == "Type" && reader.GetString(t.Namespace) == "System" ? SystemType : new object(); + } + public object? GetTypeFromSerializedName(string name) => name; + public PrimitiveTypeCode GetUnderlyingEnumType(object? type) => PrimitiveTypeCode.Int32; + public bool IsSystemType(object? type) => type is string s && s == SystemType; + } +} diff --git a/Services/AvailableModsService.cs b/Services/AvailableModsService.cs new file mode 100644 index 0000000..efa3af6 --- /dev/null +++ b/Services/AvailableModsService.cs @@ -0,0 +1,69 @@ +using CVRManager.Models; + +namespace CVRManager.Services; + +public record RepoOffer(string Repo, string Asset, List Releases); + +public class AvailableEntry +{ + public string Key { get; init; } = ""; + public HashSet Keys { get; } = new(); + public string Name { get; set; } = ""; + public CvrmgMod? Cvrmg { get; set; } + public List Repos { get; } = new(); +} + +public static class AvailableModsService +{ + public static async Task> BuildAsync( + CvrmgService cvrmg, ModImportService importer, IReadOnlyList sources, bool force, Action log, CancellationToken ct) + { + if (force) importer.Invalidate(); + var byKey = new Dictionary(); + var entries = new List(); + + if (sources.Any(s => s.Kind == "cvrmg")) + { + try + { + foreach (var m in await cvrmg.GetAllAsync(ct, force)) + { + var e = new AvailableEntry { Key = CvrmgService.Normalize(m.Name), Name = m.Name, Cvrmg = m }; + foreach (var n in new[] { m.Name }.Concat(m.Aliases)) e.Keys.Add(CvrmgService.Normalize(n)); + e.Keys.RemoveWhere(k => k.Length == 0); + if (e.Keys.Count == 0) continue; + entries.Add(e); + foreach (var k in e.Keys) byKey.TryAdd(k, e); + } + } + catch (Exception ex) when (ex is not OperationCanceledException) + { + log($"CVRMG could not be loaded: {ex.Message}"); + } + } + + foreach (var src in sources.Where(s => s.Kind == "github" && s.Repo.Length > 0)) + { + var releases = await importer.ReleasesAsync(src.Repo, log, ct, force); + var assets = new Dictionary(); + foreach (var r in releases) + foreach (var a in r.Assets.Where(a => a.Name.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))) + assets.TryAdd(CvrmgService.Normalize(Path.GetFileNameWithoutExtension(a.Name)), a.Name); + + foreach (var (key, asset) in assets) + { + if (key.Length == 0) continue; + if (!byKey.TryGetValue(key, out var entry)) + { + entry = new AvailableEntry { Key = key, Name = Path.GetFileNameWithoutExtension(asset) }; + entry.Keys.Add(key); + byKey[key] = entry; + entries.Add(entry); + } + if (entry.Repos.All(o => !o.Repo.Equals(src.Repo, StringComparison.OrdinalIgnoreCase))) + entry.Repos.Add(new RepoOffer(src.Repo, asset, ModImportService.FilterReleases(releases, asset))); + } + } + return entries; + } +} diff --git a/Services/BranchCodeService.cs b/Services/BranchCodeService.cs new file mode 100644 index 0000000..0712452 --- /dev/null +++ b/Services/BranchCodeService.cs @@ -0,0 +1,36 @@ +using SteamKit2; + +namespace CVRManager.Services; + +public static class BranchCodeService +{ + public static async Task> ResolveAsync(string code, string account, string refreshToken, CancellationToken ct) + { + await using var link = await SteamLink.OpenAsync(account, refreshToken, ct); + return await ResolveAsync(link, code); + } + + public static async Task> ResolveAsync(SteamLink link, string code) + { + var call = link.Apps.CheckAppBetaPassword((uint)Paths.AppId, code).ToTask(); + if (await Task.WhenAny(call, Task.Delay(TimeSpan.FromSeconds(25))) != call) + throw new TimeoutException("Steam did not answer the code check. It limits how often codes can be checked; try again in a few minutes."); + var reply = await call; + if (reply.Result == EResult.OK) return new Dictionary(reply.BetaPasswords); + throw new InvalidOperationException(reply.Result switch + { + EResult.InvalidPassword => "Steam did not accept that access code.", + EResult.RateLimitExceeded => "Steam is rate limiting code checks. Wait a few minutes and try again.", + _ => $"Steam could not check the code ({reply.Result}){(link.IsAnonymous ? "; sign in to Steam in Settings and try again" : "")}.", + }); + } + + public static string ProtectKey(byte[] key) => TokenVault.Protect(Convert.ToBase64String(key)); + + public static byte[]? UnprotectKey(string stored) + { + var text = TokenVault.Unprotect(stored); + try { return text.Length == 0 ? null : Convert.FromBase64String(text); } + catch (FormatException) { return null; } + } +} diff --git a/Services/CacheGuardService.cs b/Services/CacheGuardService.cs new file mode 100644 index 0000000..f830700 --- /dev/null +++ b/Services/CacheGuardService.cs @@ -0,0 +1,129 @@ +using System.Text.Json; +using System.Text.Json.Nodes; + +namespace CVRManager.Services; + +public static class CacheGuardService +{ + const string AssemblyName = "CVRCacheGuard"; + const string AssemblyFile = AssemblyName + ".dll"; + const int UserAssemblyType = 16; + + static string Source => Path.Combine(AppContext.BaseDirectory, "CacheGuard"); + + static string Managed(string gameDir) => Path.Combine(gameDir, "ChilloutVR_Data", "Managed"); + + public static void Deploy(string gameDir, Action log, string? source = null) + { + var managed = Managed(gameDir); + var scripting = Path.Combine(gameDir, "ChilloutVR_Data", "ScriptingAssemblies.json"); + var init = Path.Combine(gameDir, "ChilloutVR_Data", "RuntimeInitializeOnLoads.json"); + source ??= Source; + if (!Directory.Exists(source) || !Directory.Exists(managed) || !File.Exists(scripting) || !File.Exists(init)) return; + + var changed = false; + var deps = Path.Combine(managed, AssemblyName); + Directory.CreateDirectory(deps); + foreach (var file in Directory.EnumerateFiles(source, "*.dll")) + { + var name = Path.GetFileName(file); + var target = name == AssemblyFile ? Path.Combine(managed, name) : Path.Combine(deps, name); + changed |= CopyIfDifferent(file, target); + } + + var scriptingJson = JsonNode.Parse(File.ReadAllText(scripting))!.AsObject(); + var names = scriptingJson["names"]!.AsArray(); + var types = scriptingJson["types"]!.AsArray(); + if (!names.Any(n => n?.GetValue() == AssemblyFile)) + { + names.Add(AssemblyFile); + types.Add(UserAssemblyType); + WriteJson(scripting, scriptingJson); + changed = true; + } + + var initJson = JsonNode.Parse(File.ReadAllText(init))!.AsObject(); + var root = initJson["root"]!.AsArray(); + if (!root.Any(e => e?["assemblyName"]?.GetValue() == AssemblyName)) + { + root.Add(new JsonObject + { + ["assemblyName"] = AssemblyName, + ["nameSpace"] = AssemblyName, + ["className"] = "Entry", + ["methodName"] = "Init", + ["loadTypes"] = 2, + ["isUnityClass"] = false, + }); + WriteJson(init, initJson); + changed = true; + } + if (changed) log("Multi-instance cache guard added to this install."); + } + + public static void Remove(string gameDir, Action log) + { + var data = Path.Combine(gameDir, "ChilloutVR_Data"); + var scripting = Path.Combine(data, "ScriptingAssemblies.json"); + var init = Path.Combine(data, "RuntimeInitializeOnLoads.json"); + var changed = false; + + if (File.Exists(scripting)) + { + var json = JsonNode.Parse(File.ReadAllText(scripting))!.AsObject(); + var names = json["names"]!.AsArray(); + var types = json["types"]!.AsArray(); + for (var i = names.Count - 1; i >= 0; i--) + if (names[i]?.GetValue() == AssemblyFile) + { + names.RemoveAt(i); + if (i < types.Count) types.RemoveAt(i); + changed = true; + } + if (changed) WriteJson(scripting, json); + } + if (File.Exists(init)) + { + var json = JsonNode.Parse(File.ReadAllText(init))!.AsObject(); + var root = json["root"]!.AsArray(); + var before = root.Count; + for (var i = root.Count - 1; i >= 0; i--) + if (root[i]?["assemblyName"]?.GetValue() == AssemblyName) root.RemoveAt(i); + if (root.Count != before) + { + WriteJson(init, json); + changed = true; + } + } + + var managed = Managed(gameDir); + try + { + File.Delete(Path.Combine(managed, AssemblyFile)); + var deps = Path.Combine(managed, AssemblyName); + if (Directory.Exists(deps)) Directory.Delete(deps, true); + } + catch (Exception e) when (e is IOException or UnauthorizedAccessException) { } + if (changed) log("Multi-instance cache guard removed from this install."); + } + + static bool CopyIfDifferent(string source, string target) + { + var s = new FileInfo(source); + var t = new FileInfo(target); + if (t.Exists && t.Length == s.Length && t.LastWriteTimeUtc == s.LastWriteTimeUtc) return false; + try + { + File.Copy(source, target, true); + File.SetLastWriteTimeUtc(target, s.LastWriteTimeUtc); + return true; + } + catch (IOException) when (t.Exists) + { + return false; + } + } + + static void WriteJson(string path, JsonNode node) => + File.WriteAllText(path, node.ToJsonString(new JsonSerializerOptions { WriteIndented = false }), new System.Text.UTF8Encoding(false)); +} diff --git a/Services/CacheService.cs b/Services/CacheService.cs new file mode 100644 index 0000000..e969b8f --- /dev/null +++ b/Services/CacheService.cs @@ -0,0 +1,169 @@ +using System.Diagnostics; +using CVRManager.Models; + +namespace CVRManager.Services; + +public enum CacheState { Missing, Shared, Local, LinkedElsewhere } + +public static class CacheService +{ + public static CacheState GetState(InstallInfo install) + { + var path = Paths.CacheDir(install); + var info = new DirectoryInfo(path); + if (!info.Exists) return CacheState.Missing; + if (!info.Attributes.HasFlag(FileAttributes.ReparsePoint)) return CacheState.Local; + var target = info.LinkTarget; + return target != null && SamePath(target, Paths.SharedCache) ? CacheState.Shared : CacheState.LinkedElsewhere; + } + + static bool SamePath(string a, string b) => + string.Equals(Path.GetFullPath(a).TrimEnd('\\'), Path.GetFullPath(b).TrimEnd('\\'), StringComparison.OrdinalIgnoreCase); + + public static Task LinkAsync(InstallInfo install, Action log, CancellationToken ct) => Task.Run(() => + { + var path = Paths.CacheDir(install); + Directory.CreateDirectory(Paths.SharedCache); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + + switch (GetState(install)) + { + case CacheState.Shared: + return; + case CacheState.Local: + MergeInto(path, Paths.SharedCache, log, ct); + if (Directory.EnumerateFileSystemEntries(path).Any()) + throw new IOException($"Cache folder still has content after merge: {path}"); + Directory.Delete(path); + break; + case CacheState.LinkedElsewhere: + Directory.Delete(path, false); + break; + } + CreateJunction(path, Paths.SharedCache); + log("Cache now points at the shared cache."); + }, ct); + + public static void MergeInto(string source, string shared, Action log, CancellationToken ct) + { + Directory.CreateDirectory(shared); + var moved = 0; + var dupes = 0; + var sameRoot = string.Equals(Path.GetPathRoot(Path.GetFullPath(source)), Path.GetPathRoot(Path.GetFullPath(shared)), StringComparison.OrdinalIgnoreCase); + + foreach (var entry in Directory.EnumerateFileSystemEntries(source).ToList()) + { + ct.ThrowIfCancellationRequested(); + var name = Path.GetFileName(entry); + var dest = Path.Combine(shared, name); + var isDir = Directory.Exists(entry); + + if (!(isDir ? Directory.Exists(dest) : File.Exists(dest))) + { + if (isDir) + { + if (sameRoot) Directory.Move(entry, dest); + else + { + CopyTree(entry, dest, ct); + Directory.Delete(entry, true); + } + } + else File.Move(entry, dest); + moved++; + } + else if (isDir) + { + if (MergeTree(entry, dest, ct)) Directory.Delete(entry, true); + dupes++; + } + else + { + if (new FileInfo(entry).Length == new FileInfo(dest).Length) File.Delete(entry); + dupes++; + } + } + log($"Cache merge: {moved} entries moved, {dupes} duplicates removed."); + } + + public static void CopyInto(string source, string shared, Action log, CancellationToken ct) + { + Directory.CreateDirectory(shared); + var copied = 0; + foreach (var file in Directory.EnumerateFiles(source, "*", SearchOption.AllDirectories)) + { + ct.ThrowIfCancellationRequested(); + var target = Path.Combine(shared, Path.GetRelativePath(source, file)); + if (File.Exists(target)) continue; + Directory.CreateDirectory(Path.GetDirectoryName(target)!); + File.Copy(file, target); + copied++; + } + log($"Cache copy: {copied} files added to the shared cache."); + } + + static bool MergeTree(string src, string dst, CancellationToken ct) + { + var clean = true; + foreach (var file in Directory.EnumerateFiles(src, "*", SearchOption.AllDirectories).ToList()) + { + ct.ThrowIfCancellationRequested(); + var rel = Path.GetRelativePath(src, file); + var target = Path.Combine(dst, rel); + if (!File.Exists(target)) + { + Directory.CreateDirectory(Path.GetDirectoryName(target)!); + File.Move(file, target); + } + else if (new FileInfo(file).Length == new FileInfo(target).Length) File.Delete(file); + else clean = false; + } + return clean; + } + + static void CopyTree(string src, string dst, CancellationToken ct) + { + Directory.CreateDirectory(dst); + foreach (var file in Directory.EnumerateFiles(src, "*", SearchOption.AllDirectories)) + { + ct.ThrowIfCancellationRequested(); + var target = Path.Combine(dst, Path.GetRelativePath(src, file)); + Directory.CreateDirectory(Path.GetDirectoryName(target)!); + File.Copy(file, target, true); + } + } + + public static void CreateJunction(string link, string target) + { + var psi = new ProcessStartInfo("cmd.exe") + { + CreateNoWindow = true, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + }; + psi.ArgumentList.Add("/c"); + psi.ArgumentList.Add("mklink"); + psi.ArgumentList.Add("/J"); + psi.ArgumentList.Add(link); + psi.ArgumentList.Add(target); + using var p = Process.Start(psi)!; + var err = p.StandardError.ReadToEnd() + p.StandardOutput.ReadToEnd(); + p.WaitForExit(); + if (p.ExitCode != 0) throw new IOException($"mklink failed: {err.Trim()}"); + } + + public static void RemoveLinkIfJunction(string path) + { + var info = new DirectoryInfo(path); + if (info.Exists && info.Attributes.HasFlag(FileAttributes.ReparsePoint)) Directory.Delete(path, false); + } + + public static long SizeOf(string path) + { + if (!Directory.Exists(path)) return 0; + long total = 0; + foreach (var f in new DirectoryInfo(path).EnumerateFiles("*", SearchOption.AllDirectories)) total += f.Length; + return total; + } +} diff --git a/Services/ConfigStore.cs b/Services/ConfigStore.cs new file mode 100644 index 0000000..c7d4a1f --- /dev/null +++ b/Services/ConfigStore.cs @@ -0,0 +1,91 @@ +using System.Text.Json; +using CVRManager.Models; + +namespace CVRManager.Services; + +public static class ConfigStore +{ + static readonly JsonSerializerOptions Options = new() { WriteIndented = true }; + + public static AppConfig Load() + { + AppConfig cfg; + try + { + cfg = File.Exists(Paths.ConfigFile) + ? JsonSerializer.Deserialize(File.ReadAllText(Paths.ConfigFile), Options) ?? new AppConfig() + : new AppConfig(); + } + catch + { + File.Copy(Paths.ConfigFile, Paths.ConfigFile + ".broken", true); + cfg = new AppConfig(); + } + + if (string.IsNullOrWhiteSpace(cfg.LibraryRoot)) cfg.LibraryRoot = Paths.Root; + Paths.Root = cfg.LibraryRoot; + + if (cfg.Mods.All(m => m.Id != ModDef.MelonLoaderId)) + cfg.Mods.Insert(0, new ModDef + { + Id = ModDef.MelonLoaderId, + Name = "MelonLoader", + Repo = "LavaGang/MelonLoader", + Type = "Root", + AssetFilter = "MelonLoader.x64.zip", + }); + EnsureSources(cfg); + return cfg; + } + + static readonly (string Name, string Repo)[] DefaultRepos = + { + ("NAK CVR Mods", "NotAKidoS/NAK_CVR_Mods"), + ("Kafe CVR Mods", "kafeijao/Kafe_CVR_Mods"), + ("SDraw mods", "SDraw/ml_mods_cvr"), + ("Nirv mods", "Nirv-git/CVRMods-Nirv"), + ("Daky mods", "dakyneko/DakyModsCVR"), + ("ddakebono mods", "ddakebono/Chillout-VR-Mods"), + }; + + static void EnsureSources(AppConfig cfg) + { + if (cfg.Sources.All(s => s.Id != SourceDef.CvrmgId)) + cfg.Sources.Insert(0, new SourceDef { Id = SourceDef.CvrmgId, Name = "CVRMG (approved mods)", Kind = "cvrmg", Builtin = true }); + foreach (var (name, repo) in DefaultRepos) + if (cfg.Sources.All(s => !s.Repo.Equals(repo, StringComparison.OrdinalIgnoreCase)) && !cfg.SeededSources.Contains(repo)) + { + cfg.Sources.Add(new SourceDef { Id = repo.Replace('/', '_'), Name = name, Kind = "github", Repo = repo, Builtin = true }); + cfg.SeededSources.Add(repo); + } + } + + public static List LoadBranches() + { + try + { + return File.Exists(Paths.BranchCache) + ? JsonSerializer.Deserialize>(File.ReadAllText(Paths.BranchCache), Options) ?? new() + : new(); + } + catch { return new(); } + } + + public static void SaveBranches(IEnumerable branches) + { + try + { + Directory.CreateDirectory(Path.GetDirectoryName(Paths.BranchCache)!); + File.WriteAllText(Paths.BranchCache, JsonSerializer.Serialize(branches, Options)); + } + catch { } + } + + public static void Save(AppConfig cfg) + { + Directory.CreateDirectory(Paths.ConfigDir); + var tmp = Paths.ConfigFile + ".tmp"; + File.WriteAllText(tmp, JsonSerializer.Serialize(cfg, Options)); + File.Move(tmp, Paths.ConfigFile, true); + } +} diff --git a/Services/CvrmgService.cs b/Services/CvrmgService.cs new file mode 100644 index 0000000..8a6c934 --- /dev/null +++ b/Services/CvrmgService.cs @@ -0,0 +1,101 @@ +using System.Net.Http.Headers; +using System.Text.Json; +using System.Text.RegularExpressions; +using CVRManager.Models; + +namespace CVRManager.Services; + +public record CvrmgMod( + int Id, string Name, string[] Aliases, string Category, string ModVersion, string GameVersion, string LoaderVersion, + string Type, string Author, string Description, string DownloadLink, string SourceLink, string Hash, int ApprovalStatus, DateTime Updated) +{ + public string StatusText => ApprovalStatus switch { 1 => "approved", 2 => "outdated", 3 => "obsolete", _ => "unknown" }; + public string ModType => Type.Equals("Plugin", StringComparison.OrdinalIgnoreCase) ? "Plugins" : "Mods"; +} + +public class CvrmgService +{ + const string ListUrl = "https://api.cvrmg.com/v1/mods"; + readonly HttpClient http = new(); + List? cache; + DateTime fetched; + + public CvrmgService() + { + http.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("CVRManager", "1.0")); + } + + public static string Normalize(string s) => Regex.Replace(s ?? "", "[^a-z0-9]", "", RegexOptions.IgnoreCase).ToLowerInvariant(); + + public async Task> GetAllAsync(CancellationToken ct, bool force = false) + { + if (!force && cache != null && DateTime.UtcNow - fetched < TimeSpan.FromMinutes(10)) return cache; + var path = Path.Combine(Paths.Root, "sources", "cvrmg.json"); + string? json = null; + if (!force && File.Exists(path) && DateTime.UtcNow - File.GetLastWriteTimeUtc(path) < TimeSpan.FromHours(1)) + json = await File.ReadAllTextAsync(path, ct); + if (json == null) + { + try + { + using var resp = await http.GetAsync(ListUrl, ct); + if (!resp.IsSuccessStatusCode) throw new InvalidOperationException($"CVRMG returned {(int)resp.StatusCode}."); + json = await resp.Content.ReadAsStringAsync(ct); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + await File.WriteAllTextAsync(path, json, ct); + } + catch (Exception e) when (e is not OperationCanceledException && File.Exists(path)) + { + json = await File.ReadAllTextAsync(path, ct); + } + } + using var doc = JsonDocument.Parse(json); + var list = new List(); + foreach (var m in doc.RootElement.EnumerateArray()) + { + if (!m.TryGetProperty("versions", out var versions) || versions.ValueKind != JsonValueKind.Array) continue; + JsonElement? best = null; + var bestNo = int.MinValue; + foreach (var v in versions.EnumerateArray()) + { + var no = v.TryGetProperty("_version", out var n) && n.ValueKind == JsonValueKind.Number ? n.GetInt32() : 0; + if (no >= bestNo) { best = v; bestNo = no; } + } + if (best is not { } ver) continue; + + string S(JsonElement e, string k) => e.TryGetProperty(k, out var p) && p.ValueKind == JsonValueKind.String ? p.GetString() ?? "" : ""; + var aliases = m.TryGetProperty("aliases", out var al) && al.ValueKind == JsonValueKind.Array + ? al.EnumerateArray().Where(a => a.ValueKind == JsonValueKind.String).Select(a => a.GetString()!).ToArray() + : Array.Empty(); + DateTime.TryParse(S(ver, "updateDate"), null, System.Globalization.DateTimeStyles.AdjustToUniversal, out var updated); + list.Add(new CvrmgMod( + m.GetProperty("_id").GetInt32(), S(ver, "name"), aliases, S(m, "category"), + S(ver, "modVersion"), S(ver, "gameVersion"), S(ver, "loaderVersion").TrimStart('v'), S(ver, "modType"), + S(ver, "author"), S(ver, "description"), S(ver, "downloadLink"), S(ver, "sourceLink"), S(ver, "hash"), + ver.TryGetProperty("approvalStatus", out var st) && st.ValueKind == JsonValueKind.Number ? st.GetInt32() : 0, updated)); + } + cache = list; + fetched = DateTime.UtcNow; + return list; + } + + public static ReleaseInfo ToRelease(CvrmgMod m, string fileName) => new() + { + Tag = m.ModVersion, + Published = m.Updated, + GameVersion = m.GameVersion, + LoaderVersion = m.LoaderVersion, + Assets = { new AssetInfo { Name = fileName, Url = m.DownloadLink, Hash = m.Hash } }, + }; + + public static void ApplyMeta(ModDef def, CvrmgMod m) + { + def.CvrmgId = m.Id; + if (def.Author.Length == 0) def.Author = m.Author; + def.Description = m.Description; + def.LatestVersion = m.ModVersion; + def.Category = m.Category; + def.Status = m.StatusText; + if (def.SourceLink.Length == 0) def.SourceLink = m.SourceLink; + } +} diff --git a/Services/FileOps.cs b/Services/FileOps.cs new file mode 100644 index 0000000..a91fd9f --- /dev/null +++ b/Services/FileOps.cs @@ -0,0 +1,43 @@ +namespace CVRManager.Services; + +public static class FileOps +{ + public static void CopyTree(string src, string dst, Func skip, Action log, CancellationToken ct) + { + Directory.CreateDirectory(dst); + var count = 0; + foreach (var entry in new DirectoryInfo(src).EnumerateFileSystemInfos()) + { + ct.ThrowIfCancellationRequested(); + if (skip(entry.FullName)) continue; + var target = Path.Combine(dst, entry.Name); + if (entry is DirectoryInfo d) + { + if (d.Attributes.HasFlag(FileAttributes.ReparsePoint)) continue; + CopyTree(d.FullName, target, skip, log, ct); + } + else + { + File.Copy(entry.FullName, target, true); + if (++count % 200 == 0) log($"Copying {Path.GetFileName(src)}..."); + } + } + } + + public static void DeleteDirectorySafe(string path) + { + if (!Directory.Exists(path)) return; + foreach (var d in new DirectoryInfo(path).EnumerateDirectories("*", SearchOption.AllDirectories).ToList()) + if (d.Exists && d.Attributes.HasFlag(FileAttributes.ReparsePoint)) d.Delete(false); + Directory.Delete(path, true); + } + + public static string Slug(string name) + { + var s = new string(name.Select(c => char.IsLetterOrDigit(c) ? c : '-').ToArray()).Trim('-'); + return s.Length == 0 ? "install" : s; + } + + public static string FormatSize(long bytes) => + bytes >= 1L << 30 ? $"{bytes / (double)(1L << 30):0.0} GB" : $"{bytes / (double)(1L << 20):0} MB"; +} diff --git a/Services/GameWindow.cs b/Services/GameWindow.cs new file mode 100644 index 0000000..e9bee03 --- /dev/null +++ b/Services/GameWindow.cs @@ -0,0 +1,91 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; + +namespace CVRManager.Services; + +public static class GameWindow +{ + const uint WM_SETICON = 0x0080; + const int ICON_SMALL = 0; + const int ICON_BIG = 1; + const int SM_CXICON = 11; + const int SM_CXSMICON = 49; + + delegate bool EnumProc(IntPtr hwnd, IntPtr lParam); + + [DllImport("user32.dll")] + static extern bool EnumWindows(EnumProc proc, IntPtr lParam); + + [DllImport("user32.dll")] + static extern uint GetWindowThreadProcessId(IntPtr hwnd, out uint pid); + + [DllImport("user32.dll")] + static extern bool IsWindowVisible(IntPtr hwnd); + + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + static extern int GetClassName(IntPtr hwnd, StringBuilder name, int max); + + [DllImport("user32.dll", SetLastError = true)] + static extern IntPtr SendMessageTimeout(IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam, uint flags, uint timeout, out IntPtr result); + + const uint SMTO_ABORTIFHUNG = 2; + + [DllImport("user32.dll")] + static extern int GetSystemMetrics(int index); + + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + static extern uint PrivateExtractIcons(string file, int index, int cx, int cy, IntPtr[] icons, uint[] ids, uint count, uint flags); + + static IntPtr FindUnityWindow(int pid) + { + var found = IntPtr.Zero; + var name = new StringBuilder(64); + EnumWindows((hwnd, _) => + { + GetWindowThreadProcessId(hwnd, out var owner); + if (owner != pid || !IsWindowVisible(hwnd)) return true; + name.Clear(); + GetClassName(hwnd, name, name.Capacity); + if (name.ToString() == "UnityWndClass") found = hwnd; + return true; + }, IntPtr.Zero); + return found; + } + + static void SetIcons(IntPtr hwnd, string exe) + { + foreach (var (kind, size) in new[] { (ICON_SMALL, GetSystemMetrics(SM_CXSMICON)), (ICON_BIG, GetSystemMetrics(SM_CXICON)) }) + { + var icons = new IntPtr[1]; + var ids = new uint[1]; + if (PrivateExtractIcons(exe, 0, size, size, icons, ids, 1, 0) > 0 && icons[0] != IntPtr.Zero) + SendMessageTimeout(hwnd, WM_SETICON, (IntPtr)kind, icons[0], SMTO_ABORTIFHUNG, 1000, out _); + } + } + + public static async Task ApplyIconWhenReadyAsync(Process proc, string exe) + { + if (!OperatingSystem.IsWindows()) return; + try + { + var hwnd = IntPtr.Zero; + for (var i = 0; i < 240 && hwnd == IntPtr.Zero; i++) + { + if (proc.HasExited) return; + hwnd = FindUnityWindow(proc.Id); + if (hwnd == IntPtr.Zero) await Task.Delay(250); + } + if (hwnd == IntPtr.Zero) return; + + foreach (var wait in new[] { 0, 3000, 7000, 20000 }) + { + await Task.Delay(wait); + if (proc.HasExited) return; + var current = FindUnityWindow(proc.Id); + if (current != IntPtr.Zero) SetIcons(current, exe); + } + } + catch (InvalidOperationException) { } + } +} diff --git a/Services/GitHubService.cs b/Services/GitHubService.cs new file mode 100644 index 0000000..f4f03a7 --- /dev/null +++ b/Services/GitHubService.cs @@ -0,0 +1,102 @@ +using System.Net.Http.Headers; +using System.Text.Json; +using System.Text.RegularExpressions; +using CVRManager.Models; + +namespace CVRManager.Services; + +public class GitHubService +{ + readonly HttpClient http = new(); + readonly Func token; + + public GitHubService(Func token) + { + this.token = token; + http.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("CVRManager", "1.0")); + http.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.github+json")); + } + + public static string? ParseRepo(string input) + { + input = input.Trim(); + var m = Regex.Match(input, @"^(?:https?://github\.com/)?([\w.-]+)/([\w.-]+?)(?:\.git)?(?:/.*)?$"); + return m.Success ? $"{m.Groups[1].Value}/{m.Groups[2].Value}" : null; + } + + HttpRequestMessage Request(string url) + { + var req = new HttpRequestMessage(HttpMethod.Get, url); + var t = token(); + if (!string.IsNullOrWhiteSpace(t)) req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", t); + return req; + } + + public async Task> GetReleasesAsync(string repo, CancellationToken ct) + { + using var resp = await http.SendAsync(Request($"https://api.github.com/repos/{repo}/releases?per_page=40"), ct); + if (!resp.IsSuccessStatusCode) + { + var hint = (int)resp.StatusCode is 403 or 429 ? " (rate limited: add a GitHub token in Settings)" : ""; + throw new InvalidOperationException($"GitHub returned {(int)resp.StatusCode} for {repo}{hint}."); + } + using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync(ct)); + var list = new List(); + foreach (var r in doc.RootElement.EnumerateArray()) + { + if (r.GetProperty("draft").GetBoolean()) continue; + var rel = new ReleaseInfo + { + Tag = r.GetProperty("tag_name").GetString() ?? "", + Prerelease = r.GetProperty("prerelease").GetBoolean(), + Published = r.TryGetProperty("published_at", out var p) && p.ValueKind == JsonValueKind.String ? p.GetDateTime() : default, + }; + foreach (var a in r.GetProperty("assets").EnumerateArray()) + rel.Assets.Add(new AssetInfo + { + Name = a.GetProperty("name").GetString() ?? "", + Url = a.GetProperty("browser_download_url").GetString() ?? "", + Size = a.GetProperty("size").GetInt64(), + }); + list.Add(rel); + } + return list; + } + + public async Task GetMelonLoaderNightlyAsync(CancellationToken ct) + { + using var resp = await http.SendAsync(Request( + "https://api.github.com/repos/LavaGang/MelonLoader/actions/workflows/build.yml/runs?branch=master&status=success&per_page=1"), ct); + if (!resp.IsSuccessStatusCode) return null; + using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync(ct)); + var runs = doc.RootElement.GetProperty("workflow_runs"); + if (runs.GetArrayLength() == 0) return null; + var run = runs[0]; + var sha = run.GetProperty("head_sha").GetString() ?? ""; + var id = run.GetProperty("id").GetInt64(); + var rel = new ReleaseInfo + { + Tag = $"nightly-{sha[..Math.Min(7, sha.Length)]}", + Prerelease = true, + Published = run.GetProperty("created_at").GetDateTime(), + }; + rel.Assets.Add(new AssetInfo + { + Name = "MelonLoader.x64.zip", + Url = $"https://nightly.link/LavaGang/MelonLoader/actions/runs/{id}/MelonLoader.Windows.x64.CI.Release.zip", + }); + return rel; + } + + public async Task DownloadAsync(string url, string path, CancellationToken ct) + { + using var resp = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, ct); + resp.EnsureSuccessStatusCode(); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + await using var src = await resp.Content.ReadAsStreamAsync(ct); + await using var dst = File.Create(path); + await src.CopyToAsync(dst, ct); + var last = resp.RequestMessage?.RequestUri?.Segments.LastOrDefault() ?? ""; + return Uri.UnescapeDataString(last.TrimEnd('/')); + } +} diff --git a/Services/HookService.cs b/Services/HookService.cs new file mode 100644 index 0000000..030a3f5 --- /dev/null +++ b/Services/HookService.cs @@ -0,0 +1,130 @@ +using System.Diagnostics; +using System.Text; +using CVRManager.Models; + +namespace CVRManager.Services; + +public static class HookService +{ + static readonly TimeSpan Timeout = TimeSpan.FromMinutes(5); + + public static async Task> RunEventAsync( + IEnumerable hooks, InstallInfo install, string evt, string buildId, Action log, CancellationToken ct) + { + var failures = new List(); + foreach (var hook in hooks.Where(h => install.HookIds.Contains(h.Id) && h.Runs(evt))) + { + try + { + if (!await RunAsync(hook, install, buildId, log, ct)) failures.Add(hook.Name); + } + catch (OperationCanceledException) { throw; } + catch (Exception e) + { + log($"[{hook.Name}] failed: {e.Message}"); + failures.Add(hook.Name); + } + } + return failures; + } + + public static async Task RunAsync(HookDef hook, InstallInfo install, string buildId, Action log, CancellationToken ct) + { + var game = Paths.GameDir(install); + if (!Directory.Exists(Path.Combine(game, "ChilloutVR_Data"))) + { + log($"[{hook.Name}] skipped: the game files are not installed yet."); + return true; + } + log($"[{hook.Name}] running for {install.Name}..."); + return await RunCommandAsync(hook, install, game, buildId, log, ct); + } + + static async Task RunCommandAsync(HookDef hook, InstallInfo install, string game, string buildId, Action log, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(hook.Command)) throw new InvalidOperationException("The hook has no command set."); + string Expand(string s) => s + .Replace("{game}", game, StringComparison.OrdinalIgnoreCase) + .Replace("{install}", install.Name, StringComparison.OrdinalIgnoreCase) + .Replace("{branch}", install.Branch, StringComparison.OrdinalIgnoreCase) + .Replace("{build}", buildId, StringComparison.OrdinalIgnoreCase); + + var command = Expand(hook.Command.Trim()); + var args = SplitArgs(Expand(hook.Arguments)).ToList(); + var ext = Path.GetExtension(command).ToLowerInvariant(); + ProcessStartInfo psi; + if (ext == ".ps1") + { + psi = new ProcessStartInfo(Path.Combine(Environment.SystemDirectory, "WindowsPowerShell", "v1.0", "powershell.exe")); + foreach (var a in new[] { "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", command }) psi.ArgumentList.Add(a); + } + else if (ext is ".bat" or ".cmd") + { + psi = new ProcessStartInfo("cmd.exe"); + psi.ArgumentList.Add("/c"); + psi.ArgumentList.Add(command); + } + else psi = new ProcessStartInfo(command); + foreach (var a in args) psi.ArgumentList.Add(a); + + psi.Environment["CVR_GAME_DIR"] = game; + psi.Environment["CVR_INSTALL_NAME"] = install.Name; + psi.Environment["CVR_BRANCH"] = install.Branch; + psi.Environment["CVR_BUILD"] = buildId; + + var code = await RunProcessAsync(psi, game, hook.Name, log, ct); + if (code != 0) log($"[{hook.Name}] exited with code {code}"); + return code == 0; + } + + static async Task RunProcessAsync(ProcessStartInfo psi, string workDir, string label, Action log, CancellationToken ct) + { + psi.WorkingDirectory = workDir; + psi.UseShellExecute = false; + psi.CreateNoWindow = true; + psi.RedirectStandardOutput = true; + psi.RedirectStandardError = true; + psi.RedirectStandardInput = true; + psi.StandardOutputEncoding = Encoding.UTF8; + psi.StandardErrorEncoding = Encoding.UTF8; + + using var proc = new Process { StartInfo = psi }; + proc.OutputDataReceived += (_, e) => { if (!string.IsNullOrWhiteSpace(e.Data)) log($"[{label}] {e.Data.TrimEnd()}"); }; + proc.ErrorDataReceived += (_, e) => { if (!string.IsNullOrWhiteSpace(e.Data)) log($"[{label}] {e.Data.TrimEnd()}"); }; + proc.Start(); + proc.StandardInput.Close(); + proc.BeginOutputReadLine(); + proc.BeginErrorReadLine(); + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(Timeout); + try + { + await proc.WaitForExitAsync(cts.Token); + } + catch (OperationCanceledException) + { + try { proc.Kill(true); } catch { } + if (ct.IsCancellationRequested) throw; + throw new TimeoutException($"timed out after {Timeout.TotalMinutes:0} minutes"); + } + proc.WaitForExit(); + return proc.ExitCode; + } + + public static IEnumerable SplitArgs(string s) + { + var sb = new StringBuilder(); + var quoted = false; + foreach (var c in s) + { + if (c == '"') quoted = !quoted; + else if (char.IsWhiteSpace(c) && !quoted) + { + if (sb.Length > 0) { yield return sb.ToString(); sb.Clear(); } + } + else sb.Append(c); + } + if (sb.Length > 0) yield return sb.ToString(); + } +} diff --git a/Services/InstallFolders.cs b/Services/InstallFolders.cs new file mode 100644 index 0000000..e26916d --- /dev/null +++ b/Services/InstallFolders.cs @@ -0,0 +1,35 @@ +using CVRManager.Models; + +namespace CVRManager.Services; + +public static class InstallFolders +{ + public static string UniqueFolder(IEnumerable all, InstallInfo self, string name) + { + var stem = $"{Paths.SafeFolderName(name)}-{self.Id[..4]}"; + var candidate = stem; + for (var n = 2; Taken(all, self, candidate); n++) candidate = $"{stem}-{n}"; + return candidate; + } + + static bool Taken(IEnumerable all, InstallInfo self, string candidate) + { + if (all.Any(i => !ReferenceEquals(i, self) && i.Folder.Equals(candidate, StringComparison.OrdinalIgnoreCase))) return true; + if (candidate.Equals(self.Folder, StringComparison.OrdinalIgnoreCase)) return false; + return Directory.Exists(Path.Combine(Paths.InstallsRoot, candidate)); + } + + public static void Rename(InstallInfo info, string desiredFolder) + { + var oldDir = Paths.InstallDir(info); + var newDir = Path.Combine(Paths.InstallsRoot, desiredFolder); + if (oldDir.Equals(newDir, StringComparison.Ordinal)) return; + if (oldDir.Equals(newDir, StringComparison.OrdinalIgnoreCase)) + { + var temp = oldDir + ".renaming"; + Directory.Move(oldDir, temp); + Directory.Move(temp, newDir); + } + else Directory.Move(oldDir, newDir); + } +} diff --git a/Services/MlLogColours.cs b/Services/MlLogColours.cs new file mode 100644 index 0000000..056b27c --- /dev/null +++ b/Services/MlLogColours.cs @@ -0,0 +1,99 @@ +using System.Text; +using System.Text.RegularExpressions; + +namespace CVRManager.Services; + +public static class MlLogColours +{ + const string Esc = "\u001b["; + const string Reset = "\u001b[0m"; + const long MaxScan = 16L << 20; + + static readonly Regex Sgr = new(@"\u001b\[([0-9;]*)m", RegexOptions.Compiled); + static readonly Regex AnyEsc = new(@"\u001b\[[0-9;?]*[A-Za-z]", RegexOptions.Compiled); + static readonly Regex Stamp = new(@"^\[(\d\d:\d\d:\d\d\.\d{3})\] (.*)$", RegexOptions.Compiled); + + sealed class FileIndex + { + public long Offset; + public string? State; + public readonly Dictionary Lines = new(StringComparer.Ordinal); + } + + static readonly Dictionary Files = new(StringComparer.OrdinalIgnoreCase); + static readonly object Gate = new(); + static long version; + + public static long Refresh(params string[] paths) + { + lock (Gate) + { + foreach (var path in paths) Scan(path); + return version; + } + } + + static void Scan(string path) + { + if (!Files.TryGetValue(path, out var index)) Files[path] = index = new FileIndex(); + try + { + if (!File.Exists(path)) + { + if (index.Offset != 0 || index.Lines.Count > 0) { Files[path] = new FileIndex(); version++; } + return; + } + using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); + var length = fs.Length; + if (length < index.Offset) { Files[path] = index = new FileIndex(); version++; } + if (length == index.Offset) return; + var start = Math.Max(index.Offset, length - MaxScan); + var buffer = new byte[length - start]; + fs.Seek(start, SeekOrigin.Begin); + fs.ReadExactly(buffer); + var end = Array.LastIndexOf(buffer, (byte)'\n'); + if (end < 0) return; + var text = Encoding.UTF8.GetString(buffer, 0, end + 1); + if (start > index.Offset) index.State = null; + index.Offset = start + end + 1; + foreach (var raw in text.Split('\n')) Add(index, raw.TrimEnd('\r')); + version++; + } + catch (Exception e) when (e is IOException or UnauthorizedAccessException) { } + } + + static void Add(FileIndex index, string line) + { + var hasEsc = line.IndexOf('\u001b') >= 0; + if (!hasEsc && index.State == null) return; + var styled = index.State == null ? line : Esc + index.State + "m" + line; + foreach (Match m in Sgr.Matches(line)) + { + var codes = m.Groups[1].Value; + index.State = codes is "" or "0" or "39" ? null : codes; + } + if (index.State != null) styled += Reset; + var plain = AnyEsc.Replace(line, ""); + if (plain.Trim().Length > 0) index.Lines[plain] = styled; + } + + public static string Colour(string mlText, params string[] paths) + { + var sb = new StringBuilder(mlText.Length * 2); + lock (Gate) + { + foreach (var raw in mlText.Split('\n')) + { + var line = raw.TrimEnd('\r'); + string? styled = null; + for (var i = paths.Length - 1; i >= 0 && styled == null; i--) + if (Files.TryGetValue(paths[i], out var index)) index.Lines.TryGetValue(line, out styled); + if (styled == null && Stamp.Match(line) is { Success: true } m) + styled = $"{Esc}38;2;211;211;211m[{Reset}{Esc}38;2;50;205;50m{m.Groups[1].Value}{Reset}{Esc}38;2;211;211;211m] {m.Groups[2].Value}{Reset}"; + sb.Append(styled ?? line).Append('\n'); + } + } + if (sb.Length > 0 && !mlText.EndsWith('\n')) sb.Length--; + return sb.ToString(); + } +} diff --git a/Services/ModImportService.cs b/Services/ModImportService.cs new file mode 100644 index 0000000..5100f07 --- /dev/null +++ b/Services/ModImportService.cs @@ -0,0 +1,217 @@ +using CVRManager.Models; + +namespace CVRManager.Services; + +public record Identified(AssemblyDetails File, string Folder, string Source, string Repo, string AssetName, CvrmgMod? Cvrmg, string Why); + +public class ModImportService +{ + static readonly string[] Folders = { "Mods", "Plugins", "UserLibs" }; + + readonly GitHubService github; + readonly CvrmgService cvrmg; + readonly Dictionary> repoReleases = new(StringComparer.OrdinalIgnoreCase); + + public ModImportService(GitHubService github, CvrmgService cvrmg) + { + this.github = github; + this.cvrmg = cvrmg; + } + + public static string Norm(string s) => CvrmgService.Normalize(s); + + public async Task> IdentifyAsync(string gameDir, IEnumerable sources, Action log, CancellationToken ct) + { + var files = new List<(AssemblyDetails Details, string Folder)>(); + foreach (var folder in Folders) + { + var dir = Path.Combine(gameDir, folder); + if (!Directory.Exists(dir)) continue; + foreach (var f in Directory.EnumerateFiles(dir, "*.dll", SearchOption.TopDirectoryOnly).OrderBy(f => f, StringComparer.OrdinalIgnoreCase)) + files.Add((AssemblyReader.Read(f), folder)); + foreach (var sub in Directory.EnumerateDirectories(dir)) + log($"Skipping folder {folder}\\{Path.GetFileName(sub)} (only loose DLLs are imported)."); + } + log($"Found {files.Count} mod files."); + + List catalog = new(); + try { catalog = await cvrmg.GetAllAsync(ct); } + catch (Exception e) when (e is not OperationCanceledException) { log($"CVRMG unavailable ({e.Message}); matching without it."); } + + var index = new Dictionary>(); + foreach (var src in sources.Where(s => s.Kind == "github" && s.Repo.Length > 0)) + { + var releases = await ReleasesAsync(src.Repo, log, ct); + foreach (var r in releases) + foreach (var a in r.Assets.Where(a => a.Name.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))) + { + var key = Norm(a.Name); + if (!index.TryGetValue(key, out var l)) index[key] = l = new(); + if (l.All(x => !x.Repo.Equals(src.Repo, StringComparison.OrdinalIgnoreCase))) l.Add((src.Repo, a.Name)); + } + } + + var result = new List(); + foreach (var (d, folder) in files) + { + ct.ThrowIfCancellationRequested(); + var cm = catalog.FirstOrDefault(m => m.Hash.Length > 0 && m.Hash == d.Sha256); + var cmWhy = cm != null ? "same file as the current CVRMG release" : ""; + if (cm == null) + { + var keys = new[] { d.MelonName, d.AssemblyName, Path.GetFileNameWithoutExtension(d.FileName) } + .Select(Norm).Where(k => k.Length > 0).Distinct().ToList(); + cm = catalog.Where(m => new[] { m.Name }.Concat(m.Aliases).Select(Norm).Any(keys.Contains)) + .OrderBy(m => m.ApprovalStatus == 1 ? 0 : 1).ThenByDescending(m => m.Updated).FirstOrDefault(); + if (cm != null) cmWhy = "name match in CVRMG"; + } + + string? repo = null, asset = null, why = ""; + var link = GitHubService.ParseRepo(d.MelonLink.Contains("github.com", StringComparison.OrdinalIgnoreCase) ? d.MelonLink : ""); + if (link != null) + { + var rel = await ReleasesAsync(link, log, ct); + var hit = rel.SelectMany(r => r.Assets).FirstOrDefault(a => Norm(a.Name) == Norm(d.FileName)); + if (hit != null) { repo = link; asset = hit.Name; why = "download link in the mod's own metadata"; } + } + if (repo == null && index.TryGetValue(Norm(d.FileName), out var cands)) + { + var pick = cands.FirstOrDefault(c => d.MelonAuthor.Length > 0 && c.Repo.Split('/')[0].Equals(d.MelonAuthor, StringComparison.OrdinalIgnoreCase)); + if (pick == default) pick = cands[0]; + repo = pick.Repo; + asset = pick.Asset; + why = "release assets of " + repo; + } + + if (repo != null) result.Add(new Identified(d, folder, "github", repo, asset!, cm, why)); + else if (cm != null) result.Add(new Identified(d, folder, "cvrmg", "", "", cm, cmWhy)); + else result.Add(new Identified(d, folder, "local", "", "", null, + d.MelonLink.Length > 0 ? $"no published release contains it; its metadata points at {d.MelonLink}" : "no known source")); + } + return result; + } + + public void Invalidate() => repoReleases.Clear(); + + public async Task> ReleasesAsync(string repo, Action log, CancellationToken ct, bool force = false) + { + if (!force && repoReleases.TryGetValue(repo, out var cached)) return cached; + var path = Path.Combine(Paths.Root, "sources", "gh_" + Paths.Safe(repo.Replace('/', '_')) + ".json"); + try + { + if (!force && File.Exists(path) && DateTime.UtcNow - File.GetLastWriteTimeUtc(path) < TimeSpan.FromHours(1)) + { + var fromDisk = System.Text.Json.JsonSerializer.Deserialize>(await File.ReadAllTextAsync(path, ct)); + if (fromDisk != null) return repoReleases[repo] = fromDisk; + } + var list = await github.GetReleasesAsync(repo, ct); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + await File.WriteAllTextAsync(path, System.Text.Json.JsonSerializer.Serialize(list), ct); + return repoReleases[repo] = list; + } + catch (Exception e) when (e is not OperationCanceledException) + { + if (File.Exists(path)) + { + try + { + var stale = System.Text.Json.JsonSerializer.Deserialize>(await File.ReadAllTextAsync(path, ct)); + if (stale != null) + { + log($"{repo}: using cached releases ({e.Message})"); + return repoReleases[repo] = stale; + } + } + catch (System.Text.Json.JsonException) { } + } + log($"{repo}: {e.Message}"); + return repoReleases[repo] = new(); + } + } + + public static string SnapshotTag(AssemblyDetails d) => + $"installed {d.Version} ({Convert.ToHexString(Convert.FromBase64String(d.Sha256))[..6].ToLowerInvariant()})"; + + public int Apply(AppConfig cfg, InstallInfo? install, IEnumerable found, Action log, string? gameDir = null) + { + var game = gameDir ?? Paths.GameDir(install!); + var added = 0; + foreach (var it in found) + { + var rel = $"{it.Folder}/{it.File.FileName}"; + if (install != null && install.Deployed.Values.Any(l => l.Contains(rel, StringComparer.OrdinalIgnoreCase))) continue; + + var def = FindOrCreate(cfg, it); + var tag = SnapshotTag(it.File); + if (def.Releases.All(r => r.Tag != tag)) + def.Releases.Add(new ReleaseInfo { Tag = tag, Snapshot = true, Published = File.GetLastWriteTime(Path.Combine(game, it.Folder, it.File.FileName)) }); + + var filesDir = Paths.ModFilesDir(def, tag); + if (!ModStore.IsDownloaded(def, tag)) + { + Directory.CreateDirectory(filesDir); + File.Copy(Path.Combine(game, it.Folder, it.File.FileName), Path.Combine(filesDir, it.File.FileName), true); + File.WriteAllText(Path.Combine(Paths.ModVersionDir(def, tag), ".complete"), ""); + } + + if (install != null) + { + install.Mods.RemoveAll(a => a.ModId == def.Id); + install.Mods.Add(new ModAssignment { ModId = def.Id, Version = tag, Enabled = true }); + install.Deployed[def.Id] = ModStore.MapFiles(def, tag).Keys.ToList(); + } + added++; + log($"{def.Name} {it.File.Version}: {Describe(it)}"); + } + return added; + } + + static string Describe(Identified it) => it.Source switch + { + "github" => $"GitHub {it.Repo} ({it.Why})", + "cvrmg" => $"CVRMG ({it.Why})", + _ => $"kept as a local snapshot ({it.Why})", + }; + + ModDef FindOrCreate(AppConfig cfg, Identified it) + { + ModDef? def = it.Source switch + { + "github" => cfg.Mods.FirstOrDefault(m => m.Source == "github" && m.Repo.Equals(it.Repo, StringComparison.OrdinalIgnoreCase) && Norm(m.AssetFilter) == Norm(it.AssetName)), + "cvrmg" => cfg.Mods.FirstOrDefault(m => m.CvrmgId == it.Cvrmg!.Id && m.Source == "cvrmg"), + _ => cfg.Mods.FirstOrDefault(m => m.Local && Norm(m.FileName) == Norm(it.File.FileName)), + }; + if (def != null) return def; + + def = new ModDef + { + Name = it.Cvrmg?.Name is { Length: > 0 } n ? n : it.File.MelonName.Length > 0 ? it.File.MelonName : it.File.AssemblyName, + Type = it.Folder, + FileName = it.File.FileName, + Author = it.File.MelonAuthor, + Source = it.Source, + Local = it.Source == "local", + }; + if (it.Cvrmg != null) CvrmgService.ApplyMeta(def, it.Cvrmg); + if (def.SourceLink.Length == 0 && it.File.MelonLink.Length > 0) def.SourceLink = it.File.MelonLink; + switch (it.Source) + { + case "github": + def.Repo = it.Repo; + def.AssetFilter = it.AssetName; + def.SourceLink = $"https://github.com/{it.Repo}"; + def.Releases = FilterReleases(repoReleases.GetValueOrDefault(it.Repo) ?? new(), def.AssetFilter); + break; + case "cvrmg": + def.Releases = new() { CvrmgService.ToRelease(it.Cvrmg!, it.File.FileName) }; + break; + } + cfg.Mods.Add(def); + return def; + } + + public static List FilterReleases(IEnumerable releases, string assetFilter) => + string.IsNullOrWhiteSpace(assetFilter) + ? releases.ToList() + : releases.Where(r => r.Assets.Any(a => ModStore.AssetMatches(a.Name, assetFilter))).ToList(); +} diff --git a/Services/ModStore.cs b/Services/ModStore.cs new file mode 100644 index 0000000..0f81254 --- /dev/null +++ b/Services/ModStore.cs @@ -0,0 +1,183 @@ +using System.IO.Compression; +using System.Security.Cryptography; +using CVRManager.Models; + +namespace CVRManager.Services; + +public class ModStore +{ + static readonly string[] KnownRoots = { "Mods", "Plugins", "UserLibs", "UserData", "MelonLoader" }; + const string Marker = ".complete"; + + readonly GitHubService github; + + public ModStore(GitHubService github) => this.github = github; + + public static string ResolveTag(ModDef mod, string version) => + version == "latest" ? mod.LatestTag ?? "" : version; + + public static bool IsDownloaded(ModDef mod, string tag) => + tag.Length > 0 && File.Exists(Path.Combine(Paths.ModVersionDir(mod, tag), Marker)); + + public async Task EnsureDownloadedAsync(ModDef mod, string tag, Action log, CancellationToken ct) + { + if (IsDownloaded(mod, tag)) return; + if (mod.Local) throw new InvalidOperationException($"Local files for {mod.Name} are missing from the store."); + + var rel = mod.Releases.FirstOrDefault(r => r.Tag == tag) + ?? throw new InvalidOperationException($"{mod.Name} has no release {tag}; refresh versions."); + var assets = PickAssets(mod, rel); + if (assets.Count == 0) + throw new InvalidOperationException( + $"{mod.Name} {tag}: no downloadable .dll or .zip asset matched. Assets: {string.Join(", ", rel.Assets.Select(a => a.Name))}. Set an asset filter on the mod."); + + var dir = Paths.ModVersionDir(mod, tag); + if (Directory.Exists(dir)) Directory.Delete(dir, true); + var files = Paths.ModFilesDir(mod, tag); + Directory.CreateDirectory(files); + + foreach (var a in assets) + { + log($"Downloading {a.Name} ({a.Size / 1024} KB)..."); + var tmp = Path.Combine(dir, Paths.Safe(a.Name)); + var served = await github.DownloadAsync(a.Url, tmp, ct); + if (a.Hash.Length > 0) + { + var actual = Convert.ToBase64String(SHA256.HashData(await File.ReadAllBytesAsync(tmp, ct))); + if (actual != a.Hash) + { + File.Delete(tmp); + throw new InvalidOperationException($"{a.Name}: the downloaded file does not match the hash its source published."); + } + } + var isZip = a.Name.EndsWith(".zip", StringComparison.OrdinalIgnoreCase) || served.EndsWith(".zip", StringComparison.OrdinalIgnoreCase); + if (isZip) + { + ZipFile.ExtractToDirectory(tmp, files, true); + File.Delete(tmp); + } + else + { + var name = mod.Source == "cvrmg" && served.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) ? served : a.Name; + File.Move(tmp, Path.Combine(files, Paths.Safe(name)), true); + } + } + File.WriteAllText(Path.Combine(dir, Marker), ""); + } + + static List PickAssets(ModDef mod, ReleaseInfo rel) + { + if (mod.Source == "cvrmg") return rel.Assets.ToList(); + if (!string.IsNullOrWhiteSpace(mod.AssetFilter)) + { + return rel.Assets.Where(a => AssetMatches(a.Name, mod.AssetFilter)).ToList(); + } + var dlls = rel.Assets.Where(a => a.Name.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)).ToList(); + if (dlls.Count > 0) return dlls; + return rel.Assets.Where(a => a.Name.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)).Take(1).ToList(); + } + + public static bool AssetMatches(string assetName, string filter) + { + foreach (var f in filter.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) + { + if (f.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + { + if (CvrmgService.Normalize(assetName) == CvrmgService.Normalize(f)) return true; + } + else if (assetName.Contains(f, StringComparison.OrdinalIgnoreCase)) return true; + } + return false; + } + + public void ImportLocal(ModDef mod, IEnumerable paths) + { + var dir = Paths.ModVersionDir(mod, "local"); + if (Directory.Exists(dir)) Directory.Delete(dir, true); + var files = Paths.ModFilesDir(mod, "local"); + Directory.CreateDirectory(files); + foreach (var p in paths) + { + if (p.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)) ZipFile.ExtractToDirectory(p, files, true); + else File.Copy(p, Path.Combine(files, Path.GetFileName(p)), true); + } + File.WriteAllText(Path.Combine(dir, Marker), ""); + } + + public static void DeleteVersion(ModDef mod, string tag) + { + var dir = Paths.ModVersionDir(mod, tag); + if (Directory.Exists(dir)) Directory.Delete(dir, true); + } + + public static Dictionary MapFiles(ModDef mod, string tag) + { + var root = Paths.ModFilesDir(mod, tag); + var map = new Dictionary(StringComparer.OrdinalIgnoreCase); + if (!Directory.Exists(root)) return map; + foreach (var file in Directory.EnumerateFiles(root, "*", SearchOption.AllDirectories)) + { + var rel = Path.GetRelativePath(root, file).Replace('\\', '/'); + map[Target(mod, rel)] = file; + } + return map; + } + + static string Target(ModDef mod, string rel) + { + if (mod.Type == "Root") return rel; + var first = rel.Split('/')[0]; + if (rel.Contains('/') && KnownRoots.Any(k => k.Equals(first, StringComparison.OrdinalIgnoreCase))) return rel; + if (rel.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) return $"{mod.Type}/{Path.GetFileName(rel)}"; + return $"{mod.Type}/{rel}"; + } + + public async Task ApplyAsync(InstallInfo install, IReadOnlyList catalog, Action log, CancellationToken ct) + { + var game = Paths.GameDir(install); + if (!Directory.Exists(game)) throw new InvalidOperationException("The install has no game files yet. Update it first."); + + var desired = new Dictionary>(); + foreach (var a in install.Mods.Where(a => a.Enabled)) + { + var mod = catalog.FirstOrDefault(m => m.Id == a.ModId); + if (mod == null) continue; + var tag = ResolveTag(mod, a.Version); + if (tag.Length == 0) throw new InvalidOperationException($"{mod.Name} has no versions; refresh versions in the Mods tab."); + await EnsureDownloadedAsync(mod, tag, log, ct); + desired[mod.Id] = MapFiles(mod, tag); + } + + foreach (var modId in install.Deployed.Keys.ToList()) + { + var keep = desired.TryGetValue(modId, out var map) ? map.Keys.ToHashSet(StringComparer.OrdinalIgnoreCase) : new HashSet(); + foreach (var rel in install.Deployed[modId].Where(r => !keep.Contains(r))) + DeleteTracked(game, rel); + if (!desired.ContainsKey(modId)) install.Deployed.Remove(modId); + } + + foreach (var (modId, map) in desired) + { + foreach (var (rel, src) in map) + { + var dest = Path.Combine(game, rel.Replace('/', Path.DirectorySeparatorChar)); + Directory.CreateDirectory(Path.GetDirectoryName(dest)!); + File.Copy(src, dest, true); + } + install.Deployed[modId] = map.Keys.ToList(); + log($"Deployed {catalog.First(m => m.Id == modId).Name} ({map.Count} files)"); + } + } + + static void DeleteTracked(string game, string rel) + { + var path = Path.Combine(game, rel.Replace('/', Path.DirectorySeparatorChar)); + if (File.Exists(path)) File.Delete(path); + var dir = Path.GetDirectoryName(path); + while (!string.IsNullOrEmpty(dir) && dir.Length > game.Length && Directory.Exists(dir) && !Directory.EnumerateFileSystemEntries(dir).Any()) + { + Directory.Delete(dir); + dir = Path.GetDirectoryName(dir); + } + } +} diff --git a/Services/MultiInstance.cs b/Services/MultiInstance.cs new file mode 100644 index 0000000..7e3f2fd --- /dev/null +++ b/Services/MultiInstance.cs @@ -0,0 +1,48 @@ +using System.Text; +using System.Text.RegularExpressions; + +namespace CVRManager.Services; + +public static class MultiInstance +{ + const int KeepLogs = 7; + + static readonly Regex SingleInstanceLine = new(@"^single-instance[^\r\n]*(\r?\n|$)", RegexOptions.Multiline | RegexOptions.Compiled); + + public static void Prepare(string gameDir, Action log) + { + RemoveSingleInstanceFlag(gameDir, log); + PruneMelonLoaderLogs(gameDir, log); + } + + static void RemoveSingleInstanceFlag(string gameDir, Action log) + { + var boot = Path.Combine(gameDir, "ChilloutVR_Data", "boot.config"); + if (!File.Exists(boot)) return; + var text = File.ReadAllText(boot); + var cleaned = SingleInstanceLine.Replace(text, ""); + if (cleaned == text) return; + File.WriteAllText(boot, cleaned, new UTF8Encoding(false)); + log("Removed 'single-instance' from boot.config so more than one instance can run."); + } + + static void PruneMelonLoaderLogs(string gameDir, Action log) + { + var logs = Path.Combine(gameDir, "MelonLoader", "Logs"); + if (!Directory.Exists(logs)) return; + var files = new DirectoryInfo(logs).GetFiles("*.log").OrderBy(f => f.LastWriteTimeUtc).ToList(); + var excess = files.Count - KeepLogs; + var removed = 0; + foreach (var f in files) + { + if (removed >= excess) break; + try + { + f.Delete(); + removed++; + } + catch (Exception e) when (e is IOException or UnauthorizedAccessException) { } + } + if (removed > 0) log($"Removed {removed} old MelonLoader log(s) so a second instance does not trip MelonLoader's log cleanup."); + } +} diff --git a/Services/Paths.cs b/Services/Paths.cs new file mode 100644 index 0000000..d7aba3d --- /dev/null +++ b/Services/Paths.cs @@ -0,0 +1,59 @@ +using CVRManager.Models; + +namespace CVRManager.Services; + +public static class Paths +{ + public const int AppId = 661130; + + public static string ConfigDir => Environment.GetEnvironmentVariable("CVRMANAGER_CONFIG_DIR") is { Length: > 0 } custom + ? custom + : Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CVRManager"); + public static string ConfigFile => Path.Combine(ConfigDir, "config.json"); + + public static string Root { get; set; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CVRManager"); + + public static string SharedCache => Path.Combine(Root, "cache"); + public static string ModStore => Path.Combine(Root, "mods"); + public static string BranchCache => Path.Combine(Root, "sources", "branches.json"); + + public static string InstallsRoot => Path.Combine(Root, "installs"); + public static string InstallDir(InstallInfo i) => Path.Combine(InstallsRoot, i.Folder); + public static string GameDir(InstallInfo i) => InstallDir(i); + + public static string SafeFolderName(string name) + { + var bad = Path.GetInvalidFileNameChars(); + var cleaned = new string(name.Select(c => bad.Contains(c) ? ' ' : c).ToArray()); + while (cleaned.Contains(" ")) cleaned = cleaned.Replace(" ", " "); + cleaned = cleaned.Trim().TrimEnd('.'); + if (cleaned.Length > 60) cleaned = cleaned[..60].TrimEnd(); + return cleaned.Length == 0 ? "Install" : cleaned; + } + public static string GameDataDir(string? gameDir = null) + { + string company = "ChilloutVR", product = "ChilloutVR"; + try + { + var info = gameDir == null ? null : Path.Combine(gameDir, "ChilloutVR_Data", "app.info"); + if (info != null && File.Exists(info) && File.ReadAllLines(info) is { Length: >= 2 } l && l[0].Trim().Length > 0 && l[1].Trim().Length > 0) + (company, product) = (l[0].Trim(), l[1].Trim()); + } + catch (Exception e) when (e is IOException or UnauthorizedAccessException) { } + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "AppData", "LocalLow", company, product); + } + + public static string CacheDir(InstallInfo i) => Path.Combine(GameDir(i), "ChilloutVR_Data", "Cache"); + public static string GameExe(InstallInfo i) => Path.Combine(GameDir(i), "ChilloutVR.exe"); + public static string Manifest(InstallInfo i) => Path.Combine(GameDir(i), "steamapps", $"appmanifest_{AppId}.acf"); + + public static string ModVersionDir(ModDef m, string tag) => Path.Combine(ModStore, m.Id, Safe(tag)); + public static string ModFilesDir(ModDef m, string tag) => Path.Combine(ModVersionDir(m, tag), "files"); + + public static string Safe(string s) + { + var bad = Path.GetInvalidFileNameChars(); + var r = new string(s.Select(c => bad.Contains(c) ? '_' : c).ToArray()).Trim().TrimEnd('.'); + return r.Length == 0 ? "_" : r; + } +} diff --git a/Services/SteamDownloader.cs b/Services/SteamDownloader.cs new file mode 100644 index 0000000..53d3fce --- /dev/null +++ b/Services/SteamDownloader.cs @@ -0,0 +1,399 @@ +// The depot and chunk download flow follows DepotDownloader (https://github.com/SteamRE/DepotDownloader, +// commit 989f37b, GPL-2.0, (c) SteamRE). This file is therefore under GPL-2.0. + +using System.Buffers; +using System.Collections.Concurrent; +using System.Net; +using System.Text.Json; +using CVRManager.Models; +using SteamKit2; +using SteamKit2.CDN; + +namespace CVRManager.Services; + +public static class SteamDownloader +{ + const uint AppId = (uint)Paths.AppId; + const int MaxDownloads = 8; + const string StateFolder = ".CVRManager"; + + public sealed record PrivateBranch(string Name, string Code, byte[]? Key); + + const int MaxCodeChecksPerRefresh = 3; + + public static async Task> GetBranchesAsync( + string account, string refreshToken, IReadOnlyList privateBranches, + Action keyResolved, Action log, CancellationToken ct) + { + await using var link = await SteamLink.OpenAsync(account, refreshToken, ct); + var (root, appToken) = await RequestAppInfoAsync(link); + var depots = root["depots"]; + var branches = depots["branches"]; + if (branches == KeyValue.Invalid) throw new InvalidOperationException("Steam returned no branch data for ChilloutVR."); + var list = branches.Children + .Select(b => new BranchInfo(b.Name ?? "", b["buildid"].Value ?? "", b["pwdrequired"].Value == "1", b["description"].Value ?? "")) + .ToList(); + + var known = list.Select(b => b.Name).ToHashSet(); + var keys = new Dictionary(); + var checks = 0; + var limited = false; + foreach (var pb in privateBranches.Where(p => p.Code.Length > 0 && !known.Contains(p.Name))) + { + ct.ThrowIfCancellationRequested(); + var key = pb.Key ?? keys.GetValueOrDefault(pb.Name); + if (key == null) + { + if (limited || checks >= MaxCodeChecksPerRefresh) continue; + checks++; + try + { + foreach (var (name, k) in await BranchCodeService.ResolveAsync(link, pb.Code)) + { + keys[name] = k; + keyResolved(name, k); + } + } + catch (InvalidOperationException e) + { + log($"Could not check the code for '{pb.Name}': {e.Message}"); + limited = e.Message.Contains("RateLimit"); + continue; + } + key = keys.GetValueOrDefault(pb.Name); + if (key == null) { log($"The saved code no longer unlocks '{pb.Name}'."); continue; } + } + + var priv = await link.Apps.PICSGetPrivateBeta(AppId, appToken, pb.Name, key); + if (priv.Result != EResult.OK) { log($"Steam would not list the files of '{pb.Name}' ({priv.Result})."); continue; } + var selection = SelectDepots(depots, priv.DepotSection, pb.Name); + if (selection.Count == 0) continue; + list.Add(new BranchInfo(pb.Name, PrivateMarker(selection), true, "")); + } + + return list.OrderBy(b => b.Name == "public" ? 0 : 1).ThenBy(b => b.Name).ToList(); + } + + static string PrivateMarker(IEnumerable<(uint DepotId, ulong ManifestId)> depots) + { + var text = string.Join(";", depots.OrderBy(d => d.DepotId).Select(d => $"{d.DepotId}:{d.ManifestId}")); + return Convert.ToHexString(System.Security.Cryptography.SHA1.HashData(System.Text.Encoding.ASCII.GetBytes(text)))[..12].ToLowerInvariant(); + } + + static List<(uint DepotId, ulong ManifestId)> SelectDepots(KeyValue depotsSection, KeyValue? privateDepots, string branch) + { + var result = new List<(uint, ulong)>(); + foreach (var depot in depotsSection.Children) + { + if (!uint.TryParse(depot.Name, out var depotId) || depot.Children.Count == 0) continue; + var cfg = depot["config"]; + if (cfg != KeyValue.Invalid) + { + var os = cfg["oslist"].Value; + if (!string.IsNullOrWhiteSpace(os) && !os.Split(',').Contains("windows")) continue; + var arch = cfg["osarch"].Value; + if (!string.IsNullOrWhiteSpace(arch) && arch != "64") continue; + var lang = cfg["language"].Value; + if (!string.IsNullOrWhiteSpace(lang) && lang != "english") continue; + if (cfg["lowviolence"].AsBoolean()) continue; + } + + var gid = (privateDepots?[depot.Name!]["manifests"][branch]["gid"].Value) ?? depot["manifests"][branch]["gid"].Value; + if (gid == null && branch != "public") gid = depot["manifests"]["public"]["gid"].Value; + if (gid == null) continue; + result.Add((depotId, ulong.Parse(gid))); + } + return result.OrderBy(d => d.Item1).ToList(); + } + + static async Task<(KeyValue Root, ulong Token)> RequestAppInfoAsync(SteamLink link) + { + var tokens = await link.Apps.PICSGetAccessTokens(new List { AppId }, new List()); + tokens.AppTokens.TryGetValue(AppId, out var token); + var request = new SteamApps.PICSRequest(AppId) { AccessToken = token }; + var result = await link.Apps.PICSGetProductInfo(new List { request }, new List()); + var info = result.Results?.SelectMany(r => r.Apps).Where(a => a.Key == AppId).Select(a => a.Value).FirstOrDefault() + ?? throw new InvalidOperationException("Steam returned no app info for ChilloutVR."); + return (info.KeyValues, token); + } + + sealed record DepotPlan(uint DepotId, ulong ManifestId, byte[] Key); + + sealed class InstallState + { + public bool Complete { get; set; } + public Dictionary Manifests { get; set; } = new(); + } + + public static async Task InstallAsync( + string gameDir, string branch, string branchCode, byte[]? branchKey, Action keyResolved, + string account, string refreshToken, bool validate, Action log, Action progress, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(branch)) branch = "public"; + Directory.CreateDirectory(gameDir); + var stateDir = Path.Combine(gameDir, StateFolder); + Directory.CreateDirectory(stateDir); + + await using var link = await SteamLink.OpenAsync(account, refreshToken, ct); + log(link.IsAnonymous ? "Connected to Steam anonymously." : $"Signed in to Steam as {account}."); + + var (root, appToken) = await RequestAppInfoAsync(link); + var depotsSection = root["depots"]; + var branchNode = depotsSection["branches"][branch]; + var listed = branchNode != KeyValue.Invalid; + var buildId = listed ? branchNode["buildid"].Value ?? "" : ""; + + KeyValue? privateDepots = null; + if (!listed || branchNode["pwdrequired"].Value == "1") + { + if (string.IsNullOrEmpty(branchCode)) + throw new InvalidOperationException($"The branch '{branch}' is not public and needs its beta code. Enter the code from the branch list."); + if (branchKey == null) + { + var keys = await BranchCodeService.ResolveAsync(link, branchCode); + foreach (var (name, k) in keys) keyResolved(name, k); + if (!keys.TryGetValue(branch, out branchKey)) + throw new InvalidOperationException($"The saved code does not unlock '{branch}'. Enter the code again from the branch list."); + } + var priv = await link.Apps.PICSGetPrivateBeta(AppId, appToken, branch, branchKey); + if (priv.Result != EResult.OK) throw new InvalidOperationException($"Steam would not give out the files for '{branch}' ({priv.Result})."); + privateDepots = priv.DepotSection; + } + + var plans = new List(); + foreach (var (depotId, manifestId) in SelectDepots(depotsSection, privateDepots, branch)) + { + var keyReply = await link.Apps.GetDepotDecryptionKey(depotId, AppId); + if (keyReply.Result != EResult.OK) throw new InvalidOperationException($"Steam refused the key for depot {depotId} ({keyReply.Result})."); + plans.Add(new DepotPlan(depotId, manifestId, keyReply.DepotKey)); + } + if (plans.Count == 0) throw new InvalidOperationException("Steam listed no downloadable files for this branch."); + if (buildId.Length == 0) buildId = PrivateMarker(plans.Select(p => (p.DepotId, p.ManifestId))); + + var statePath = Path.Combine(stateDir, "state.json"); + var state = new InstallState(); + try { if (File.Exists(statePath)) state = JsonSerializer.Deserialize(File.ReadAllText(statePath)) ?? new(); } catch { } + var forceValidate = validate || !state.Complete; + state.Complete = false; + File.WriteAllText(statePath, JsonSerializer.Serialize(state)); + + var servers = await LoadServersAsync(link); + var cdn = new Client(link.Client); + var authTokens = new ConcurrentDictionary<(uint, string), string?>(); + var serverCursor = 0; + + Server NextServer() => servers[Math.Abs(Interlocked.Increment(ref serverCursor)) % servers.Count]; + + async Task TokenFor(uint depotId, Server server) + { + if (authTokens.TryGetValue((depotId, server.Host!), out var cached)) return cached; + var reply = await link.Content.GetCDNAuthToken(AppId, depotId, server.Host!); + var token = reply.Result == EResult.OK ? reply.Token : null; + authTokens[(depotId, server.Host!)] = token; + return token; + } + + var fullGameDir = Path.GetFullPath(gameDir) + Path.DirectorySeparatorChar; + string Target(string fileName) + { + var full = Path.GetFullPath(Path.Combine(gameDir, fileName)); + if (!full.StartsWith(fullGameDir, StringComparison.OrdinalIgnoreCase)) throw new InvalidOperationException($"Refusing to write outside the install folder: {fileName}"); + return full; + } + + var newManifests = new Dictionary(); + var oldManifests = new Dictionary(); + foreach (var plan in plans) + { + ct.ThrowIfCancellationRequested(); + DepotManifest? old = null; + var oldFile = Path.Combine(stateDir, $"{plan.DepotId}.manifest"); + if (state.Manifests.ContainsKey(plan.DepotId.ToString()) && File.Exists(oldFile)) + try { old = DepotManifest.LoadFromFile(oldFile); } catch { } + oldManifests[plan.DepotId] = old; + + var manifest = old is { } o && o.ManifestGID == plan.ManifestId ? o : await DownloadManifestAsync(plan); + newManifests[plan.DepotId] = manifest; + log($"Depot {plan.DepotId}: {manifest.Files!.Count} files, {FileOps.FormatSize((long)manifest.TotalUncompressedSize)}."); + } + + async Task DownloadManifestAsync(DepotPlan plan) + { + for (var attempt = 0; attempt < 8; attempt++) + { + ct.ThrowIfCancellationRequested(); + var server = NextServer(); + try + { + var code = await link.Content.GetManifestRequestCode(plan.DepotId, AppId, plan.ManifestId, branch); + if (code == 0) throw new InvalidOperationException($"Steam gave no manifest code for depot {plan.DepotId}."); + return await cdn.DownloadManifestAsync(plan.DepotId, plan.ManifestId, code, server, plan.Key, null, authTokens.GetValueOrDefault((plan.DepotId, server.Host!))); + } + catch (SteamKitWebRequestException e) when (e.StatusCode == HttpStatusCode.Forbidden && !authTokens.ContainsKey((plan.DepotId, server.Host!))) + { + await TokenFor(plan.DepotId, server); + } + catch (Exception e) when (e is not OperationCanceledException && e is not InvalidOperationException) + { + log($"Manifest download from {server.Host} failed ({e.Message}); trying another server."); + } + } + throw new InvalidOperationException($"Could not download the file list for depot {plan.DepotId}."); + } + + var work = new List<(uint DepotId, byte[] Key, DepotManifest.FileData File, string Path, List Chunks)>(); + long totalFiles = newManifests.Values.Sum(m => m.Files!.Count(f => !f.Flags.HasFlag(EDepotFileFlag.Directory))); + long scanned = 0; + log(forceValidate ? "Checking every file against Steam..." : "Looking for changed files..."); + progress(0); + + var workLock = new object(); + foreach (var plan in plans) + { + var manifest = newManifests[plan.DepotId]; + var old = oldManifests[plan.DepotId]; + var oldByName = old?.Files!.ToDictionary(f => f.FileName, StringComparer.OrdinalIgnoreCase); + + foreach (var dir in manifest.Files!.Where(f => f.Flags.HasFlag(EDepotFileFlag.Directory))) + Directory.CreateDirectory(Target(dir.FileName)); + + await Parallel.ForEachAsync(manifest.Files!.Where(f => !f.Flags.HasFlag(EDepotFileFlag.Directory)), + new ParallelOptions { MaxDegreeOfParallelism = MaxDownloads, CancellationToken = ct }, + async (file, token) => + { + await Task.Yield(); + var path = Target(file.FileName); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + var needed = NeededChunks(path, file, oldByName, forceValidate); + if (needed.Count > 0) lock (workLock) work.Add((plan.DepotId, plan.Key, file, path, needed)); + var done = Interlocked.Increment(ref scanned); + if (done % 25 == 0 || done == totalFiles) progress(done * 100.0 / totalFiles); + }); + } + + var totalBytes = work.Sum(w => w.Chunks.Sum(c => (long)c.UncompressedLength)); + if (work.Count == 0) log("Everything is already up to date."); + else + { + log($"Downloading {FileOps.FormatSize(totalBytes)} in {work.Count} file(s)..."); + progress(0); + long downloaded = 0; + var queue = work.SelectMany(w => w.Chunks.Select(c => (w.DepotId, w.Key, w.Path, Chunk: c))).ToList(); + await Parallel.ForEachAsync(queue, new ParallelOptions { MaxDegreeOfParallelism = MaxDownloads, CancellationToken = ct }, async (item, token) => + { + var buffer = ArrayPool.Shared.Rent((int)item.Chunk.UncompressedLength); + try + { + var written = 0; + for (var attempt = 0; attempt < 10 && written == 0; attempt++) + { + token.ThrowIfCancellationRequested(); + var server = NextServer(); + try + { + written = await cdn.DownloadDepotChunkAsync(item.DepotId, item.Chunk, server, buffer, item.Key, null, authTokens.GetValueOrDefault((item.DepotId, server.Host!))); + } + catch (SteamKitWebRequestException e) when (e.StatusCode == HttpStatusCode.Forbidden && !authTokens.ContainsKey((item.DepotId, server.Host!))) + { + await TokenFor(item.DepotId, server); + } + catch (Exception e) when (e is not OperationCanceledException) + { + if (attempt >= 4) log($"Chunk download from {server.Host} failed ({e.Message})."); + } + } + if (written == 0) throw new InvalidOperationException("No Steam download server could deliver a file piece. Try again in a minute."); + + await using var fs = new FileStream(item.Path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite); + fs.Seek((long)item.Chunk.Offset, SeekOrigin.Begin); + await fs.WriteAsync(buffer.AsMemory(0, written), token); + progress(Interlocked.Add(ref downloaded, written) * 100.0 / totalBytes); + } + finally { ArrayPool.Shared.Return(buffer); } + }); + } + + foreach (var plan in plans) + { + var old = oldManifests[plan.DepotId]; + if (old != null) + { + var keep = newManifests[plan.DepotId].Files!.Select(f => f.FileName).ToHashSet(StringComparer.OrdinalIgnoreCase); + foreach (var gone in old.Files!.Where(f => !f.Flags.HasFlag(EDepotFileFlag.Directory) && !keep.Contains(f.FileName))) + { + var path = Target(gone.FileName); + if (File.Exists(path)) { File.Delete(path); log($"Removed {gone.FileName}"); } + } + } + newManifests[plan.DepotId].SaveToFile(Path.Combine(stateDir, $"{plan.DepotId}.manifest")); + state.Manifests[plan.DepotId.ToString()] = plan.ManifestId; + } + state.Complete = true; + File.WriteAllText(statePath, JsonSerializer.Serialize(state)); + AppManifest.Write(gameDir, buildId, branch); + progress(100); + log($"Installed build {buildId} of '{branch}'."); + } + + static List NeededChunks( + string path, DepotManifest.FileData file, Dictionary? oldByName, bool forceValidate) + { + var chunks = file.Chunks!.OrderBy(c => c.Offset).ToList(); + var info = new FileInfo(path); + if (!info.Exists) + { + using var created = File.Create(path); + created.SetLength((long)file.TotalSize); + return chunks; + } + + if (!forceValidate && info.Length == (long)file.TotalSize + && oldByName != null && oldByName.TryGetValue(file.FileName, out var before) && before.FileHash.AsSpan().SequenceEqual(file.FileHash)) + return new(); + + using var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); + if (fs.Length != (long)file.TotalSize) fs.SetLength((long)file.TotalSize); + var needed = new List(); + var buffer = ArrayPool.Shared.Rent(chunks.Count == 0 ? 1 : (int)chunks.Max(c => c.UncompressedLength)); + try + { + foreach (var chunk in chunks) + { + fs.Seek((long)chunk.Offset, SeekOrigin.Begin); + var length = (int)chunk.UncompressedLength; + var read = 0; + while (read < length) + { + var n = fs.Read(buffer, read, length - read); + if (n == 0) break; + read += n; + } + if (read < length || Adler(buffer, length) != chunk.Checksum) needed.Add(chunk); + } + } + finally { ArrayPool.Shared.Return(buffer); } + return needed; + } + + static uint Adler(byte[] data, int length) + { + uint a = 0, b = 0; + for (var i = 0; i < length; i++) + { + a = (a + data[i]) % 65521; + b = (b + a) % 65521; + } + return a | (b << 16); + } + + static async Task> LoadServersAsync(SteamLink link) + { + var all = await link.Content.GetServersForSteamPipe(); + var list = new List(); + foreach (var s in all.Where(s => (s.AllowedAppIds.Length == 0 || s.AllowedAppIds.Contains(AppId)) && (s.Type == "SteamCache" || s.Type == "CDN")) + .OrderBy(s => s.WeightedLoad)) + for (var i = 0; i < s.NumEntries; i++) list.Add(s); + if (list.Count == 0) throw new InvalidOperationException("Steam gave no download servers."); + return list; + } +} diff --git a/Services/SteamIntegration.cs b/Services/SteamIntegration.cs new file mode 100644 index 0000000..f388a68 --- /dev/null +++ b/Services/SteamIntegration.cs @@ -0,0 +1,73 @@ +using System.Diagnostics; +using Microsoft.Win32; + +namespace CVRManager.Services; + +public static class SteamIntegration +{ + public static string? SteamPath + { + get + { + var p = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Valve\Steam", "SteamPath", null) as string; + return p == null ? null : Path.GetFullPath(p); + } + } + + public static string? SteamExe => SteamPath is { } p ? Path.Combine(p, "steam.exe") : null; + + public static bool IsRunning => Process.GetProcessesByName("steam").Length > 0; + + public static bool IsAppRunning => + Registry.GetValue($@"HKEY_CURRENT_USER\Software\Valve\Steam\Apps\{Paths.AppId}", "Running", 0) is 1; + + public static async Task EnsureRunningAsync(Action log) + { + if (IsRunning) return true; + var exe = SteamExe; + if (exe == null || !File.Exists(exe)) return false; + log("Steam is not running; starting it in the background so playtime is counted..."); + Process.Start(new ProcessStartInfo(exe, "-silent") { UseShellExecute = true }); + for (var i = 0; i < 40; i++) + { + await Task.Delay(500); + var pid = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Valve\Steam\ActiveProcess", "pid", 0) as int? ?? 0; + if (pid != 0 && IsRunning) { await Task.Delay(2000); return true; } + } + return IsRunning; + } + + public static List<(string GameDir, string Manifest)> FindExistingInstalls() + { + var result = new List<(string, string)>(); + var steam = SteamPath; + if (steam == null) return result; + var libs = new List { steam }; + try + { + var vdf = Path.Combine(steam, "steamapps", "libraryfolders.vdf"); + if (File.Exists(vdf)) + { + var doc = Vdf.ParseDocument(File.ReadAllText(vdf)); + if (doc.Dict("libraryfolders") is { } lf) + foreach (var e in lf.Values.OfType>()) + if (e.Str("path") is { Length: > 0 } p) libs.Add(p); + } + } + catch { } + + foreach (var lib in libs.Distinct(StringComparer.OrdinalIgnoreCase)) + { + var manifest = Path.Combine(lib, "steamapps", $"appmanifest_{Paths.AppId}.acf"); + if (!File.Exists(manifest)) continue; + try + { + var dir = Vdf.ParseDocument(File.ReadAllText(manifest)).Dict("AppState")?.Str("installdir") ?? "ChilloutVR"; + var game = Path.Combine(lib, "steamapps", "common", dir); + if (Directory.Exists(game)) result.Add((game, manifest)); + } + catch { } + } + return result; + } +} diff --git a/Services/SteamLink.cs b/Services/SteamLink.cs new file mode 100644 index 0000000..d473ff4 --- /dev/null +++ b/Services/SteamLink.cs @@ -0,0 +1,146 @@ +using SteamKit2; +using SteamKit2.Authentication; + +namespace CVRManager.Services; + +public sealed class SteamLink : IAsyncDisposable +{ + readonly CallbackManager manager; + readonly CancellationTokenSource stop = new(); + readonly TaskCompletionSource connected = new(TaskCreationOptions.RunContinuationsAsynchronously); + TaskCompletionSource? loggedOn; + Task pump = Task.CompletedTask; + + public SteamClient Client { get; } = new(); + public SteamUser User { get; } + public SteamApps Apps { get; } + public SteamContent Content { get; } + public bool IsAnonymous { get; private set; } + + readonly uint loginId = (uint)Random.Shared.NextInt64(0x10000, uint.MaxValue); + + SteamLink() + { + manager = new CallbackManager(Client); + User = Client.GetHandler()!; + Apps = Client.GetHandler()!; + Content = Client.GetHandler()!; + manager.Subscribe(_ => connected.TrySetResult()); + manager.Subscribe(_ => + { + var e = new InvalidOperationException("Lost the connection to Steam."); + connected.TrySetException(e); + loggedOn?.TrySetException(e); + }); + manager.Subscribe(cb => loggedOn?.TrySetResult(cb)); + } + + public static async Task ConnectAsync(CancellationToken ct) + { + var link = new SteamLink(); + link.pump = Task.Run(() => + { + while (!link.stop.IsCancellationRequested) link.manager.RunWaitCallbacks(TimeSpan.FromMilliseconds(200)); + }); + link.Client.Connect(); + try + { + await WaitAsync(link.connected.Task, TimeSpan.FromSeconds(20), "Could not reach Steam.", ct); + return link; + } + catch + { + await link.DisposeAsync(); + throw; + } + } + + public static async Task OpenAsync(string account, string refreshToken, CancellationToken ct) + { + var link = await ConnectAsync(ct); + try + { + if (string.IsNullOrEmpty(refreshToken)) await link.LogOnAnonymousAsync(ct); + else await link.LogOnAsync(account, refreshToken, ct); + return link; + } + catch + { + await link.DisposeAsync(); + throw; + } + } + + public async Task LogOnAnonymousAsync(CancellationToken ct) + { + IsAnonymous = true; + loggedOn = new(TaskCreationOptions.RunContinuationsAsynchronously); + User.LogOnAnonymous(); + Check(await WaitAsync(loggedOn.Task, TimeSpan.FromSeconds(20), "Steam did not answer the login.", ct)); + } + + public async Task LogOnAsync(string account, string refreshToken, CancellationToken ct) + { + loggedOn = new(TaskCreationOptions.RunContinuationsAsynchronously); + User.LogOn(new SteamUser.LogOnDetails { Username = account, AccessToken = refreshToken, ShouldRememberPassword = true, LoginID = loginId }); + Check(await WaitAsync(loggedOn.Task, TimeSpan.FromSeconds(20), "Steam did not answer the login.", ct)); + } + + static void Check(SteamUser.LoggedOnCallback cb) + { + if (cb.Result != EResult.OK) + throw new InvalidOperationException(cb.Result is EResult.AccessDenied or EResult.InvalidPassword or EResult.Expired or EResult.LoggedInElsewhere + ? $"Steam refused the saved sign-in ({cb.Result}); sign in again." + : $"Steam login failed: {cb.Result}"); + } + + public static async Task SignInAsync( + string account, string password, Action onDeviceConfirmation, Func> deviceCode, Func> emailCode, CancellationToken ct) + { + await using var link = await ConnectAsync(ct); + var session = await link.Client.Authentication.BeginAuthSessionViaCredentialsAsync(new AuthSessionDetails + { + Username = account, + Password = password, + IsPersistentSession = true, + DeviceFriendlyName = "CVRManager", + Authenticator = new Authenticator(onDeviceConfirmation, deviceCode, emailCode), + }); + var result = await session.PollingWaitForResultAsync(ct); + return result.RefreshToken; + } + + sealed class Authenticator(Action confirmation, Func> device, Func> email) : IAuthenticator + { + public Task GetDeviceCodeAsync(bool previousCodeWasIncorrect) => device(previousCodeWasIncorrect); + public Task GetEmailCodeAsync(string emailAddress, bool previousCodeWasIncorrect) => email(emailAddress, previousCodeWasIncorrect); + + public Task AcceptDeviceConfirmationAsync() + { + confirmation(); + return Task.FromResult(true); + } + } + + static async Task WaitAsync(Task task, TimeSpan timeout, string message, CancellationToken ct) + { + var delay = Task.Delay(timeout, ct); + if (await Task.WhenAny(task, delay) == delay) throw new TimeoutException(message); + return await task; + } + + static async Task WaitAsync(Task task, TimeSpan timeout, string message, CancellationToken ct) + { + var delay = Task.Delay(timeout, ct); + if (await Task.WhenAny(task, delay) == delay) throw new TimeoutException(message); + await task; + } + + public async ValueTask DisposeAsync() + { + stop.Cancel(); + try { Client.Disconnect(); } catch { } + await pump; + stop.Dispose(); + } +} diff --git a/Services/ThemeService.cs b/Services/ThemeService.cs new file mode 100644 index 0000000..7b2b8e6 --- /dev/null +++ b/Services/ThemeService.cs @@ -0,0 +1,196 @@ +using System.Globalization; +using System.Text.Json; +using Avalonia; +using Avalonia.Media; + +namespace CVRManager.Services; + +public sealed record ThemePreset(string Name, Color Primary, Color Secondary); + +public static class ThemeService +{ + public const string DefaultName = "Default"; + public const string GameColoursName = "My in-game colours"; + + static Color F(double r, double g, double b) => Color.FromRgb((byte)Math.Round(r * 255), (byte)Math.Round(g * 255), (byte)Math.Round(b * 255)); + + public static IReadOnlyList Presets { get; } = new[] + { + new ThemePreset(DefaultName, Color.Parse("#5B8CFF"), Color.Parse("#7AA2FF")), + new ThemePreset("ChilloutVR", F(0.894, 0.212, 0), F(1, 0.992, 0.988)), + new ThemePreset("Ocean Mist", F(0, 0.5, 0.7), F(0.4, 0.8, 1)), + new ThemePreset("Sunset Glow", F(1, 0.4, 0.3), F(1, 0.6, 0.4)), + new ThemePreset("Forest Whisper", F(0.2, 0.6, 0.2), F(0.5, 0.8, 0.5)), + new ThemePreset("Royal Dusk", F(0.5, 0.2, 0.7), F(0.7, 0.4, 1)), + new ThemePreset("Desert Bloom", F(1, 0.7, 0.3), F(1, 0.9, 0.5)), + new ThemePreset("Blossom Veil", F(1, 0.5, 0.7), F(1, 0.7, 0.9)), + new ThemePreset("Titanium White", F(1, 1, 1), F(1, 1, 1)), + new ThemePreset("Where Is My Shader", F(1, 0, 1), F(0, 1, 1)), + new ThemePreset("Cotton Candy", F(0.357, 0.812, 0.98), F(0.961, 0.671, 0.725)), + new ThemePreset("Basis", F(0.063, 0.059, 0.153), F(0.91, 0.071, 0.212)), + new ThemePreset("Unit 01", F(0.435, 0.098, 0.522), F(0.345, 0.722, 0.388)), + new ThemePreset("Spooky", F(1, 0.404, 0), F(0.545, 0, 0.545)), + new ThemePreset("Cherry", F(0.824, 0.129, 0.204), F(0.278, 0.478, 0)), + new ThemePreset("Bongo", F(0.616, 0.035, 0.906), F(0.498, 0, 0.078)), + new ThemePreset("Kaffee", F(0.482, 0.259, 0.255), F(0.843, 0.647, 0.545)), + }; + + public static IEnumerable Names => new[] { GameColoursName }.Concat(Presets.Select(p => p.Name)); + + static string GameConfigPath => Path.Combine(Paths.GameDataDir(), "game.config"); + + public static (Color Primary, Color Secondary)? ReadGameColours() + { + try + { + if (!File.Exists(GameConfigPath)) return null; + using var doc = JsonDocument.Parse(File.ReadAllText(GameConfigPath)); + var values = new Dictionary(); + foreach (var e in doc.RootElement.GetProperty("settings").EnumerateArray()) + { + var name = e.GetProperty("name").GetString() ?? ""; + if (!name.StartsWith("PlayerColorPrimary", StringComparison.Ordinal) && !name.StartsWith("PlayerColorSecondary", StringComparison.Ordinal)) continue; + if (double.TryParse(e.GetProperty("value").GetString(), NumberStyles.Float, CultureInfo.InvariantCulture, out var v)) values[name] = v; + } + Color? Read(string key) + { + if (!values.TryGetValue(key + "R", out var r) || !values.TryGetValue(key + "G", out var g) || !values.TryGetValue(key + "B", out var b)) return null; + var scale = r > 1 || g > 1 || b > 1 ? 1.0 : 255.0; + byte B(double x) => (byte)Math.Clamp(Math.Round(x * scale), 0, 255); + return Color.FromRgb(B(r), B(g), B(b)); + } + var p = Read("PlayerColorPrimary"); + var s = Read("PlayerColorSecondary"); + return p is { } pc && s is { } sc ? (pc, sc) : null; + } + catch { return null; } + } + + public static bool Apply(string name) + { + Color primary, secondary; + var ok = true; + if (name == GameColoursName) + { + if (ReadGameColours() is { } g) (primary, secondary) = g; + else + { + ok = false; + (primary, secondary) = (Presets[1].Primary, Presets[1].Secondary); + } + } + else + { + var preset = Presets.FirstOrDefault(p => p.Name == name) ?? Presets[0]; + (primary, secondary) = (preset.Primary, preset.Secondary); + } + Set(primary, secondary); + return ok; + } + + static (double H, double S, double L) ToHsl(Color c) + { + double r = c.R / 255.0, g = c.G / 255.0, b = c.B / 255.0; + var max = Math.Max(r, Math.Max(g, b)); + var min = Math.Min(r, Math.Min(g, b)); + var l = (max + min) / 2; + if (max == min) return (0, 0, l); + var d = max - min; + var s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + double h; + if (max == r) h = (g - b) / d + (g < b ? 6 : 0); + else if (max == g) h = (b - r) / d + 2; + else h = (r - g) / d + 4; + return (h * 60, s, l); + } + + static Color FromHsl(double h, double s, double l) + { + h = ((h % 360) + 360) % 360; + s = Math.Clamp(s, 0, 1); + l = Math.Clamp(l, 0, 1); + var c = (1 - Math.Abs(2 * l - 1)) * s; + var x = c * (1 - Math.Abs(h / 60 % 2 - 1)); + var m = l - c / 2; + (double r, double g, double b) = (int)(h / 60) switch + { + 0 => (c, x, 0.0), + 1 => (x, c, 0.0), + 2 => (0.0, c, x), + 3 => (0.0, x, c), + 4 => (x, 0.0, c), + _ => (c, 0.0, x), + }; + return Color.FromRgb((byte)Math.Round((r + m) * 255), (byte)Math.Round((g + m) * 255), (byte)Math.Round((b + m) * 255)); + } + + static double Luma(Color c) => (0.2126 * c.R + 0.7152 * c.G + 0.0722 * c.B) / 255.0; + + static Color PickAccent(Color primary, Color secondary) + { + bool Usable(Color c) { var (_, s, l) = ToHsl(c); return Luma(c) >= 0.18 && (s >= 0.25 || l >= 0.8); } + if (Usable(primary)) return primary; + if (Usable(secondary)) return secondary; + return Luma(primary) >= Luma(secondary) ? primary : secondary; + } + + static void Set(Color primary, Color secondary) + { + var app = Application.Current; + if (app == null) return; + var accent = PickAccent(primary, secondary); + var (h, s, l) = ToHsl(accent); + var accentL = Math.Clamp(l, 0.50, 0.68); + var accentS = s < 0.1 ? s : Math.Max(s, 0.45); + var accentColor = FromHsl(h, accentS, accentL); + var tint = Math.Min(s, 0.32); + var dimS = Math.Min(s, 0.14); + + void Brush(string key, Color c) => app.Resources[key] = new SolidColorBrush(c); + void Surface(string key, double lightness, double extraSat = 0) => Brush(key, FromHsl(h, Math.Min(tint + extraSat, 0.5), lightness)); + + app.Resources["SystemAccentColor"] = accentColor; + app.Resources["SystemAccentColorLight1"] = FromHsl(h, accentS, Math.Min(accentL + 0.08, 0.85)); + app.Resources["SystemAccentColorLight2"] = FromHsl(h, accentS, Math.Min(accentL + 0.16, 0.9)); + app.Resources["SystemAccentColorLight3"] = FromHsl(h, accentS, Math.Min(accentL + 0.24, 0.94)); + app.Resources["SystemAccentColorDark1"] = FromHsl(h, accentS, accentL - 0.08); + app.Resources["SystemAccentColorDark2"] = FromHsl(h, accentS, accentL - 0.16); + app.Resources["SystemAccentColorDark3"] = FromHsl(h, accentS, accentL - 0.24); + + Brush("AccentBrush", accentColor); + Brush("AccentHoverBrush", FromHsl(h, accentS, Math.Min(accentL + 0.08, 0.85))); + Brush("AccentPressedBrush", FromHsl(h, accentS, accentL - 0.08)); + Brush("AccentDisabledBrush", FromHsl(h, accentS * 0.4, 0.22)); + Brush("AccentFgBrush", Luma(accentColor) > 0.62 ? Color.Parse("#101114") : Colors.White); + + Surface("AppBg", 0.055); + Surface("SidebarBg", 0.04); + Surface("CardBg", 0.09); + Surface("CardBorder", 0.15); + Surface("RowHover", 0.125); + Surface("ChipBg", 0.16); + Surface("SelectedBg", 0.17, 0.08); + Surface("OverlayBg", 0.105); + Surface("ToastBg", 0.135); + Surface("GroupHeaderBg", 0.11); + Surface("GhostHover", 0.16); + Brush("DimText", FromHsl(h, dimS, 0.64)); + + Surface("ButtonBackground", 0.16); + Surface("ButtonBackgroundPointerOver", 0.2); + Surface("ButtonBackgroundPressed", 0.24); + Surface("ButtonBackgroundDisabled", 0.11); + Surface("TextControlBackground", 0.075); + Surface("TextControlBackgroundPointerOver", 0.095); + Surface("TextControlBackgroundFocused", 0.075); + Surface("TextControlBorderBrush", 0.18); + Surface("TextControlBorderBrushPointerOver", 0.25); + Brush("TextControlBorderBrushFocused", accentColor); + Surface("ComboBoxBackground", 0.075); + Surface("ComboBoxBackgroundPointerOver", 0.095); + Surface("ComboBoxBackgroundPressed", 0.095); + Surface("ComboBoxBorderBrush", 0.18); + Surface("ComboBoxBorderBrushPointerOver", 0.25); + Brush("ComboBoxBorderBrushPressed", accentColor); + } +} diff --git a/Services/TokenVault.cs b/Services/TokenVault.cs new file mode 100644 index 0000000..8be044e --- /dev/null +++ b/Services/TokenVault.cs @@ -0,0 +1,17 @@ +using System.Security.Cryptography; +using System.Text; + +namespace CVRManager.Services; + +public static class TokenVault +{ + public static string Protect(string token) => + Convert.ToBase64String(ProtectedData.Protect(Encoding.UTF8.GetBytes(token), null, DataProtectionScope.CurrentUser)); + + public static string Unprotect(string stored) + { + if (string.IsNullOrEmpty(stored)) return ""; + try { return Encoding.UTF8.GetString(ProtectedData.Unprotect(Convert.FromBase64String(stored), null, DataProtectionScope.CurrentUser)); } + catch { return ""; } + } +} diff --git a/Services/UpdateService.cs b/Services/UpdateService.cs new file mode 100644 index 0000000..0824745 --- /dev/null +++ b/Services/UpdateService.cs @@ -0,0 +1,135 @@ +using System.Diagnostics; +using System.IO.Compression; +using System.Net.Http.Headers; +using System.Reflection; +using System.Security.Cryptography; +using System.Text.Json; + +namespace CVRManager.Services; + +public record UpdateInfo(Version Version, string Tag, string ZipUrl, string HashUrl, long Size); + +public static class UpdateService +{ + public static string Host { get; } = Environment.GetEnvironmentVariable("CVRMANAGER_UPDATE_HOST") is { Length: > 0 } h ? h : "https://git.koneko.cat"; + public static string Repo { get; } = Environment.GetEnvironmentVariable("CVRMANAGER_UPDATE_REPO") is { Length: > 0 } r ? r : "Koneko/CVRManager"; + public const string AssetName = "CVRManager-win-x64.zip"; + + static readonly HttpClient Http = CreateClient(); + + static HttpClient CreateClient() + { + var http = new HttpClient { Timeout = TimeSpan.FromMinutes(10) }; + http.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("CVRManager", Current.ToString(3))); + return http; + } + + public static Version Current { get; } = Normalize(Assembly.GetEntryAssembly()?.GetName().Version ?? new Version(1, 0, 0)); + + static Version Normalize(Version v) => new(v.Major, Math.Max(v.Minor, 0), Math.Max(v.Build, 0)); + + public static bool TryParseTag(string tag, out Version version) + { + var ok = Version.TryParse(tag.TrimStart('v', 'V'), out var v); + version = ok ? Normalize(v!) : new Version(0, 0, 0); + return ok; + } + + public static async Task CheckAsync(CancellationToken ct) + { + using var resp = await Http.GetAsync($"{Host}/api/v1/repos/{Repo}/releases/latest", ct); + if (resp.StatusCode == System.Net.HttpStatusCode.NotFound) return null; + resp.EnsureSuccessStatusCode(); + using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync(ct)); + var root = doc.RootElement; + var tag = root.GetProperty("tag_name").GetString() ?? ""; + if (!TryParseTag(tag, out var version) || version <= Current) return null; + string? zip = null, hash = null; + long size = 0; + foreach (var a in root.GetProperty("assets").EnumerateArray()) + { + var name = a.GetProperty("name").GetString(); + var url = a.GetProperty("browser_download_url").GetString(); + if (name == AssetName) { zip = url; size = a.GetProperty("size").GetInt64(); } + else if (name == AssetName + ".sha256") hash = url; + } + if (zip == null || hash == null) return null; + return new UpdateInfo(version, tag, zip, hash, size); + } + + public static async Task DownloadAsync(UpdateInfo info, Action progress, CancellationToken ct) + { + var dir = Path.Combine(Paths.Root, "update", info.Tag); + if (Directory.Exists(dir)) Directory.Delete(dir, true); + Directory.CreateDirectory(dir); + var zip = Path.Combine(dir, AssetName); + + var expected = (await Http.GetStringAsync(info.HashUrl, ct)).Trim().Split(' ', '\t')[0].ToLowerInvariant(); + using (var resp = await Http.GetAsync(info.ZipUrl, HttpCompletionOption.ResponseHeadersRead, ct)) + { + resp.EnsureSuccessStatusCode(); + var total = resp.Content.Headers.ContentLength ?? info.Size; + await using var src = await resp.Content.ReadAsStreamAsync(ct); + await using var dst = File.Create(zip); + var buffer = new byte[81920]; + long done = 0; + int n; + while ((n = await src.ReadAsync(buffer, ct)) > 0) + { + await dst.WriteAsync(buffer.AsMemory(0, n), ct); + done += n; + if (total > 0) progress(done * 100.0 / total); + } + } + + string actual; + await using (var fs = File.OpenRead(zip)) actual = Convert.ToHexString(await SHA256.HashDataAsync(fs, ct)).ToLowerInvariant(); + if (actual != expected) throw new InvalidDataException("The downloaded update is corrupted (checksum mismatch)."); + + var staged = Path.Combine(dir, "files"); + ZipFile.ExtractToDirectory(zip, staged); + File.Delete(zip); + if (!File.Exists(Path.Combine(staged, "CVRManager.exe"))) throw new InvalidDataException("The update package has no CVRManager.exe."); + return staged; + } + + public static void ApplyAndRestart(string staged) + { + var exe = Environment.ProcessPath ?? throw new InvalidOperationException("Cannot find the running executable."); + var appDir = Path.GetDirectoryName(exe)!; + var script = Path.Combine(Path.GetDirectoryName(staged)!, "apply.ps1"); + File.WriteAllText(script, """ + param([int]$ProcessId, [string]$Source, [string]$Target, [string]$Exe) + $ErrorActionPreference = 'Stop' + try { Wait-Process -Id $ProcessId -Timeout 60 -ErrorAction SilentlyContinue } catch { } + $copied = $false + for ($i = 0; $i -lt 20 -and -not $copied; $i++) { + robocopy $Source $Target /E /R:1 /W:1 /NFL /NDL /NJH /NJS /NP | Out-Null + if ($LASTEXITCODE -lt 8) { $copied = $true } else { Start-Sleep -Milliseconds 500 } + } + if ($copied) { Remove-Item -LiteralPath $Source -Recurse -Force -ErrorAction SilentlyContinue } + Start-Process -FilePath $Exe -WorkingDirectory $Target + """); + var psi = new ProcessStartInfo(Path.Combine(Environment.SystemDirectory, "WindowsPowerShell", "v1.0", "powershell.exe")) + { + UseShellExecute = false, + CreateNoWindow = true, + WindowStyle = ProcessWindowStyle.Hidden, + }; + foreach (var a in new[] { "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", script, "-ProcessId", Environment.ProcessId.ToString(), "-Source", staged, "-Target", appDir, "-Exe", exe }) + psi.ArgumentList.Add(a); + Process.Start(psi); + } + + public static bool CanWriteAppDir() + { + try + { + var probe = Path.Combine(AppContext.BaseDirectory, $".w{Environment.ProcessId}"); + File.WriteAllText(probe, ""); + File.Delete(probe); + return true; + } + catch (Exception e) when (e is IOException or UnauthorizedAccessException) { return false; } + } +} diff --git a/Services/Vdf.cs b/Services/Vdf.cs new file mode 100644 index 0000000..073fa6e --- /dev/null +++ b/Services/Vdf.cs @@ -0,0 +1,99 @@ +using System.Text; + +namespace CVRManager.Services; + +public static class Vdf +{ + public static Dictionary Parse(string text, int start = 0) + { + var pos = start; + var root = new Dictionary(StringComparer.OrdinalIgnoreCase); + var key = ReadToken(text, ref pos); + if (key == null) return root; + var next = Peek(text, pos); + if (next == '{') + { + pos = text.IndexOf('{', pos) + 1; + root[key] = ParseBlock(text, ref pos); + } + return root; + } + + public static Dictionary ParseDocument(string text) + { + var pos = 0; + return ParseBlock(text, ref pos, true); + } + + static Dictionary ParseBlock(string text, ref int pos, bool toEnd = false) + { + var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); + while (true) + { + SkipSpace(text, ref pos); + if (pos >= text.Length) return dict; + if (text[pos] == '}') + { + pos++; + return dict; + } + var key = ReadToken(text, ref pos); + if (key == null) return dict; + SkipSpace(text, ref pos); + if (pos < text.Length && text[pos] == '{') + { + pos++; + dict[key] = ParseBlock(text, ref pos); + } + else + { + var val = ReadToken(text, ref pos); + if (val == null) return dict; + dict[key] = val; + } + } + } + + static char Peek(string text, int pos) + { + SkipSpace(text, ref pos); + return pos < text.Length ? text[pos] : '\0'; + } + + static void SkipSpace(string text, ref int pos) + { + while (pos < text.Length) + { + if (char.IsWhiteSpace(text[pos])) pos++; + else if (text[pos] == '/' && pos + 1 < text.Length && text[pos + 1] == '/') + while (pos < text.Length && text[pos] != '\n') pos++; + else break; + } + } + + static string? ReadToken(string text, ref int pos) + { + SkipSpace(text, ref pos); + if (pos >= text.Length || text[pos] != '"') return null; + pos++; + var sb = new StringBuilder(); + while (pos < text.Length && text[pos] != '"') + { + if (text[pos] == '\\' && pos + 1 < text.Length) + { + pos++; + sb.Append(text[pos] switch { 'n' => '\n', 't' => '\t', var c => c }); + } + else sb.Append(text[pos]); + pos++; + } + pos++; + return sb.ToString(); + } + + public static Dictionary? Dict(this Dictionary d, string key) => + d.TryGetValue(key, out var v) ? v as Dictionary : null; + + public static string Str(this Dictionary d, string key) => + d.TryGetValue(key, out var v) && v is string s ? s : ""; +} diff --git a/ViewModels/Base.cs b/ViewModels/Base.cs new file mode 100644 index 0000000..beb03b0 --- /dev/null +++ b/ViewModels/Base.cs @@ -0,0 +1,33 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Windows.Input; + +namespace CVRManager.ViewModels; + +public abstract class ObservableObject : INotifyPropertyChanged +{ + public event PropertyChangedEventHandler? PropertyChanged; + + protected bool Set(ref T field, T value, [CallerMemberName] string? name = null) + { + if (EqualityComparer.Default.Equals(field, value)) return false; + field = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); + return true; + } + + protected void Raise([CallerMemberName] string? name = null) => + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); +} + +public class RelayCommand : ICommand +{ + readonly Func run; + + public RelayCommand(Func run) => this.run = run; + public RelayCommand(Action run) => this.run = () => { run(); return Task.CompletedTask; }; + + public event EventHandler? CanExecuteChanged { add { } remove { } } + public bool CanExecute(object? parameter) => true; + public async void Execute(object? parameter) => await run(); +} diff --git a/ViewModels/GalleryViewModel.cs b/ViewModels/GalleryViewModel.cs new file mode 100644 index 0000000..e10f0a2 --- /dev/null +++ b/ViewModels/GalleryViewModel.cs @@ -0,0 +1,154 @@ +using System.Collections.ObjectModel; +using System.Windows.Input; +using Avalonia.Media.Imaging; +using Avalonia.Threading; +using Microsoft.VisualBasic.FileIO; + +namespace CVRManager.ViewModels; + +public class GalleryItemVM : ObservableObject +{ + Bitmap? thumb; + + public GalleryItemVM(GalleryViewModel owner, string path) + { + Path = path; + Name = System.IO.Path.GetFileName(path); + DateText = File.GetLastWriteTime(path).ToString("yyyy-MM-dd HH:mm"); + CopyCommand = new RelayCommand(() => owner.CopyAsync(this)); + DeleteCommand = new RelayCommand(() => owner.DeleteAsync(this)); + OpenCommand = new RelayCommand(() => owner.Open(this)); + ShowCommand = new RelayCommand(() => owner.Show(this)); + } + + public string Path { get; } + public string Name { get; } + public string DateText { get; } + public Bitmap? Thumb { get => thumb; set => Set(ref thumb, value); } + public ICommand CopyCommand { get; } + public ICommand DeleteCommand { get; } + public ICommand OpenCommand { get; } + public ICommand ShowCommand { get; } +} + +public class GalleryViewModel : ObservableObject +{ + const int PageSize = 48; + readonly MainViewModel main; + List all = new(); + int shown; + string status = ""; + bool loading; + + public GalleryViewModel(MainViewModel main) + { + this.main = main; + RefreshCommand = new RelayCommand(RefreshAsync); + MoreCommand = new RelayCommand(LoadMore); + OpenFolderCommand = new RelayCommand(() => + { + Directory.CreateDirectory(Root); + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("explorer.exe", $"\"{Root}\"") { UseShellExecute = true }); + }); + } + + public static string Root => System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "ChilloutVR"); + + public ObservableCollection Items { get; } = new(); + public ICommand RefreshCommand { get; } + public ICommand MoreCommand { get; } + public ICommand OpenFolderCommand { get; } + public string Status { get => status; private set => Set(ref status, value); } + public bool HasMore => shown < all.Count; + public bool IsEmpty => !loading && all.Count == 0; + public string FolderText => Root; + + public async Task RefreshAsync() + { + loading = true; + Status = "Looking for screenshots..."; + var found = await Task.Run(() => + { + if (!Directory.Exists(Root)) return new List(); + return Directory.EnumerateFiles(Root, "*.png", System.IO.SearchOption.AllDirectories) + .Select(f => (f, t: File.GetLastWriteTimeUtc(f))) + .OrderByDescending(x => x.t) + .Select(x => x.f) + .ToList(); + }); + loading = false; + all = found; + shown = 0; + Items.Clear(); + LoadMore(); + Raise(nameof(IsEmpty)); + } + + void LoadMore() + { + var batch = all.Skip(shown).Take(PageSize).ToList(); + shown += batch.Count; + foreach (var path in batch) + { + var item = new GalleryItemVM(this, path); + Items.Add(item); + _ = LoadThumbAsync(item); + } + Status = all.Count == 0 ? "No screenshots yet." : $"Showing {shown} of {all.Count} screenshots"; + Raise(nameof(HasMore)); + } + + static readonly SemaphoreSlim DecodeGate = new(3); + + static async Task LoadThumbAsync(GalleryItemVM item) + { + await DecodeGate.WaitAsync(); + try + { + var bmp = await Task.Run(() => + { + try + { + using var fs = File.OpenRead(item.Path); + return Bitmap.DecodeToWidth(fs, 360); + } + catch { return null; } + }); + if (bmp != null) Dispatcher.UIThread.Post(() => item.Thumb = bmp); + } + finally { DecodeGate.Release(); } + } + + public async Task CopyAsync(GalleryItemVM item) + { + if (main.CopyImage == null) return; + try + { + await main.CopyImage(item.Path); + main.ReportStatus($"Copied {item.Name} to the clipboard."); + } + catch (Exception e) { main.ReportStatus($"Could not copy the image: {e.Message}"); } + } + + public async Task DeleteAsync(GalleryItemVM item) + { + if (main.Confirm != null && !await main.Confirm($"Delete {item.Name}?\nIt is moved to the Recycle Bin.")) return; + try + { + await Task.Run(() => FileSystem.DeleteFile(item.Path, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin)); + Items.Remove(item); + all.Remove(item.Path); + shown = Math.Max(0, shown - 1); + Status = $"Showing {shown} of {all.Count} screenshots"; + Raise(nameof(HasMore)); + Raise(nameof(IsEmpty)); + } + catch (Exception e) { main.ReportStatus($"Could not delete the image: {e.Message}"); } + } + + public void Open(GalleryItemVM item) => + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(item.Path) { UseShellExecute = true }); + + public void Show(GalleryItemVM item) => + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("explorer.exe", $"/select,\"{item.Path}\"") { UseShellExecute = true }); +} diff --git a/ViewModels/ItemViewModels.cs b/ViewModels/ItemViewModels.cs new file mode 100644 index 0000000..ce58970 --- /dev/null +++ b/ViewModels/ItemViewModels.cs @@ -0,0 +1,934 @@ +using System.Collections.ObjectModel; +using System.Windows.Input; +using CVRManager.Models; +using CVRManager.Services; + +namespace CVRManager.ViewModels; + +public class AssignmentVM : ObservableObject +{ + readonly InstallVM owner; + public ModAssignment Info { get; } + public ModDef Mod { get; } + + public AssignmentVM(InstallVM owner, ModAssignment info, ModDef mod) + { + this.owner = owner; + Info = info; + Mod = mod; + RemoveCommand = new RelayCommand(() => owner.RemoveAssignment(this)); + } + + public string Name => Mod.Name; + public List Versions => new[] { "latest" }.Concat(Mod.Releases.Select(r => r.Tag)).Concat(Mod.Local ? new[] { "local" } : Array.Empty()).Distinct().ToList(); + + public string Version + { + get => Info.Version; + set + { + if (value == null || Info.Version == value) return; + Info.Version = value; + Raise(); + Raise(nameof(Resolved)); + owner.MarkPending(); + } + } + + public bool Enabled + { + get => Info.Enabled; + set + { + if (Info.Enabled == value) return; + Info.Enabled = value; + Raise(); + owner.MarkPending(); + } + } + + public string Resolved + { + get + { + var tag = ModStore.ResolveTag(Mod, Info.Version); + if (tag.Length == 0) return "no versions"; + var deployed = ModStore.IsDownloaded(Mod, tag) ? "downloaded" : "not downloaded"; + return Info.Version == "latest" ? $"= {tag} ({deployed})" : deployed; + } + } + + public ICommand RemoveCommand { get; } + public void RefreshVersions() { Raise(nameof(Versions)); Raise(nameof(Resolved)); } +} + +public class InstallVM : ObservableObject +{ + public MainViewModel Main { get; } + public InstallInfo Info { get; } + public ObservableCollection Mods { get; } = new(); + public ObservableCollection Hooks { get; } = new(); + + string installedBuild = ""; + string cacheText = ""; + bool pending; + string? mlVersionChoice; + ModDef? addChoice; + + public InstallVM(MainViewModel main, InstallInfo info) + { + Main = main; + Info = info; + ImportModsCommand = new RelayCommand(() => Main.ImportInstallModsAsync(this)); + LaunchCommand = new RelayCommand(() => Main.LaunchAsync(this)); + StopCommand = new RelayCommand(() => Main.StopAsync(this)); + LaunchDesktopCommand = new RelayCommand(() => Main.LaunchAsync(this, "desktop")); + LaunchVrCommand = new RelayCommand(() => Main.LaunchAsync(this, "vr")); + UpdateCommand = new RelayCommand(() => Main.UpdateInstallAsync(this, false)); + VerifyCommand = new RelayCommand(() => Main.UpdateInstallAsync(this, true)); + OpenFolderCommand = new RelayCommand(() => Main.OpenFolder(this)); + ApplyCommand = new RelayCommand(() => Main.ApplyModsAsync(this)); + DeleteCommand = new RelayCommand(() => Main.DeleteInstallAsync(this)); + DuplicateCommand = new RelayCommand(() => Main.DuplicateInstallAsync(this)); + LinkCacheCommand = new RelayCommand(() => Main.LinkCacheAsync(this)); + AddModCommand = new RelayCommand(AddMod); + EnterCodeCommand = new RelayCommand(() => Main.BeginCodeEntry(this)); + ToggleMlCommand = new RelayCommand(() => Main.ToggleMelonLoaderAsync(this)); + SetMlVersionCommand = new RelayCommand(() => Main.SetMelonLoaderVersionAsync(this)); + Rebuild(); + } + + public ICommand ImportModsCommand { get; } + public ICommand LaunchCommand { get; } + public ICommand StopCommand { get; } + public ICommand LaunchDesktopCommand { get; } + public ICommand LaunchVrCommand { get; } + public ICommand UpdateCommand { get; } + public ICommand VerifyCommand { get; } + public ICommand OpenFolderCommand { get; } + public ICommand ApplyCommand { get; } + public ICommand DeleteCommand { get; } + public ICommand DuplicateCommand { get; } + public ICommand LinkCacheCommand { get; } + public ICommand AddModCommand { get; } + public ICommand EnterCodeCommand { get; } + public ICommand ToggleMlCommand { get; } + public ICommand SetMlVersionCommand { get; } + + public string Name + { + get => Info.Name; + set { if (Info.Name != value) { Info.Name = value; Raise(); Raise(nameof(Title)); Main.Save(); Main.RefreshModUsage(); Main.ScheduleFolderRename(this); } } + } + + public string Branch => Info.Branch; + + public IReadOnlyList LaunchModes => LaunchModeOption.All; + + public LaunchModeOption LaunchModeChoice + { + get => LaunchModeOption.Find(Info.LaunchMode); + set + { + if (value == null || Info.LaunchMode == value.Key) return; + Info.LaunchMode = value.Key; + Raise(); + Raise(nameof(LaunchTip)); + Main.Save(); + } + } + + public string LaunchTip => $"Launch ({LaunchModeChoice.Label})"; + + public AccountChoice? AccountChoice + { + get => Main.AccountChoices.FirstOrDefault(c => c.Id == Info.AccountId) ?? Main.AccountChoices.FirstOrDefault(); + set + { + if (value == null || value.Id == Info.AccountId) return; + Info.AccountId = value.Id; + Raise(); + Main.Save(); + } + } + + public void RaiseAccount() => Raise(nameof(AccountChoice)); + + public string LaunchArgs + { + get => Info.LaunchArgs; + set { if (Info.LaunchArgs != value) { Info.LaunchArgs = value; Raise(); Main.Save(); } } + } + + LaunchArgOption? argChoice; + public LaunchArgOption? ArgChoice + { + get => argChoice; + set + { + if (value == null) return; + var text = value.Insert; + var current = Info.LaunchArgs.Trim(); + if (!(" " + current + " ").Contains(" " + text.TrimEnd() + " ", StringComparison.Ordinal)) + LaunchArgs = current.Length == 0 ? text : current + " " + text; + argChoice = value; + Raise(); + Avalonia.Threading.Dispatcher.UIThread.Post(() => { argChoice = null; Raise(); }); + } + } + + public BranchChoice? BranchHint + { + get => Main.BranchChoices.FirstOrDefault(c => c.Name == Info.Branch); + set + { + if (value == null || value.Name == Info.Branch) return; + Info.Branch = value.Name; + Info.BranchPassword = value.Code; + Raise(); + Raise(nameof(Branch)); + Raise(nameof(Title)); + RaiseStatus(); + Main.Save(); + Main.RefreshModUsage(); + } + } + + string subTab = "overview"; + public bool ShowOverview { get => subTab == "overview"; set { if (value) SetSub("overview"); } } + public bool ShowModsTab { get => subTab == "mods"; set { if (value) SetSub("mods"); } } + public bool ShowLogs { get => subTab == "logs"; set { if (value) SetSub("logs"); } } + + void SetSub(string t) + { + if (subTab == t) return; + subTab = t; + Raise(nameof(ShowOverview)); + Raise(nameof(ShowModsTab)); + Raise(nameof(ShowLogs)); + mlStamp = unityStamp = default; + RefreshLogs(); + } + + string logTab = "ml"; + public bool ShowMlLog { get => logTab == "ml"; set { if (value) { logTab = "ml"; Raise(); Raise(nameof(ShowUnityLog)); } } } + public bool ShowUnityLog { get => logTab == "unity"; set { if (value) { logTab = "unity"; Raise(); Raise(nameof(ShowMlLog)); } } } + + string mlLog = ""; + string unityLog = ""; + string mlRaw = ""; + long mlColourVersion = -1; + (long, long) mlStamp, unityStamp; + public string MlLogText { get => mlLog; private set => Set(ref mlLog, value); } + public string UnityLogText { get => unityLog; private set => Set(ref unityLog, value); } + + bool logReading; + + public void RefreshLogs() + { + if (!ShowLogs || logReading) return; + logReading = true; + var gameDir = Paths.GameDir(Info); + var ml = Path.Combine(gameDir, "MelonLoader", "Latest.log"); + var ms = mlStamp; + var us = unityStamp; + var raw = mlRaw; + var seen = mlColourVersion; + _ = Task.Run(() => + { + string? a = null, b = null; + var version = seen; + try + { + var dataDir = Paths.GameDataDir(gameDir); + var unity = Path.Combine(dataDir, "Player.log"); + var prev = Path.Combine(dataDir, "Player-prev.log"); + b = ReadTail(unity, ref us, "No Unity log yet."); + var fresh = ReadTail(ml, ref ms, ""); + version = MlLogColours.Refresh(prev, unity); + if (fresh != null) raw = fresh; + if (fresh != null || version != seen) + a = raw.Length == 0 ? "No MelonLoader log yet." : MlLogColours.Colour(raw, prev, unity); + } + finally + { + Avalonia.Threading.Dispatcher.UIThread.Post(() => + { + logReading = false; + mlStamp = ms; + unityStamp = us; + mlRaw = raw; + mlColourVersion = version; + if (a != null) MlLogText = a; + if (b != null) UnityLogText = b; + }); + } + }); + } + + static string? ReadTail(string path, ref (long, long) stamp, string empty) + { + try + { + if (!File.Exists(path)) + { + if (stamp == (-1, 0)) return null; + stamp = (-1, 0); + return empty; + } + using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); + var s = (fs.Length, 0L); + if (s == stamp) return null; + stamp = s; + const int max = 262144; + if (fs.Length > max) fs.Seek(-max, SeekOrigin.End); + using var r = new StreamReader(fs); + return r.ReadToEnd(); + } + catch (Exception e) when (e is IOException or UnauthorizedAccessException) { return null; } + } + + public string Title => $"{Info.Name} · {Info.Branch}"; + public string InstalledBuild { get => installedBuild; private set { if (Set(ref installedBuild, value)) { Raise(nameof(UpdateText)); Raise(nameof(HasGame)); } } } + public bool HasGame => File.Exists(Paths.GameExe(Info)); + + public string UpdateText + { + get + { + var remote = Main.Branches.FirstOrDefault(b => b.Name == Info.Branch)?.BuildId ?? ""; + var local = string.IsNullOrEmpty(InstalledBuild) ? "not installed" : $"build {InstalledBuild}"; + if (remote.Length == 0) return $"{local} · remote build unknown"; + if (InstalledBuild.Length == 0) return $"{local} · remote build {remote}"; + return InstalledBuild == remote ? $"{local} · up to date" : $"{local} · update available (build {remote})"; + } + } + + string installedBranch = ""; + public string InstalledBranch { get => installedBranch; private set => Set(ref installedBranch, value); } + + public string RemoteBuild => Main.Branches.FirstOrDefault(b => b.Name == Info.Branch)?.BuildId ?? ""; + public bool NotInstalled => InstalledBuild.Length == 0; + public bool BranchMismatch => InstalledBuild.Length > 0 && InstalledBranch.Length > 0 && !InstalledBranch.Equals(Info.Branch, StringComparison.OrdinalIgnoreCase); + public bool UpdateAvailable => BranchMismatch || (InstalledBuild.Length > 0 && RemoteBuild.Length > 0 && InstalledBuild != RemoteBuild); + public bool UpdateUnknown => InstalledBuild.Length > 0 && !BranchMismatch && RemoteBuild.Length == 0; + public bool UpToDate => InstalledBuild.Length > 0 && RemoteBuild.Length > 0 && !UpdateAvailable; + public string UpdateChipText => BranchMismatch ? $"Files are from {InstalledBranch}: update to switch to {Info.Branch}" : $"Update available: build {RemoteBuild}"; + public string BuildText => InstalledBuild.Length > 0 ? $"Build {InstalledBuild}" : "Not installed"; + public string CardStatus => NotInstalled ? "Not installed" + : BranchMismatch ? $"Out of date: {InstalledBranch} files" + : UpdateAvailable ? $"Out of date: build {InstalledBuild}" + : UpdateUnknown ? $"Build {InstalledBuild}: latest unknown" + : $"Build {InstalledBuild}"; + + void RaiseStatus() + { + Raise(nameof(UpdateText)); + Raise(nameof(RemoteBuild)); + Raise(nameof(NotInstalled)); + Raise(nameof(BranchMismatch)); + Raise(nameof(UpdateAvailable)); + Raise(nameof(UpdateUnknown)); + Raise(nameof(UpToDate)); + Raise(nameof(UpdateChipText)); + Raise(nameof(BuildText)); + Raise(nameof(CardStatus)); + } + + int instances; + public bool IsRunning => instances > 0; + public int InstanceCount => instances; + public string RunningText => instances > 1 ? $"Running ×{instances}" : instances == 1 ? "Running" : ""; + public string StopText => instances > 1 ? $"■ Stop all ({instances})" : "■ Stop"; + public string StopShortText => instances > 1 ? $"■ ×{instances}" : "■"; + public string StopTip => instances > 1 ? "Stop all running instances of this install" : "Stop the game"; + + public void InstanceStarted() { instances++; NotifyInstances(); } + public void InstanceEnded() { if (instances > 0) instances--; NotifyInstances(); } + public void ResetInstances() { instances = 0; NotifyInstances(); } + + void NotifyInstances() + { + Raise(nameof(IsRunning)); + Raise(nameof(InstanceCount)); + Raise(nameof(RunningText)); + Raise(nameof(StopText)); + Raise(nameof(StopShortText)); + Raise(nameof(StopTip)); + } + public string CacheText { get => cacheText; private set => Set(ref cacheText, value); } + public bool Pending { get => pending; private set { if (Set(ref pending, value)) Raise(nameof(PendingText)); } } + public string PendingText => pending ? "Unapplied mod changes" : ""; + + public bool MlPresent => File.Exists(Path.Combine(Paths.GameDir(Info), "version.dll")); + public bool MlOffPresent => File.Exists(Path.Combine(Paths.GameDir(Info), "version.dll.off")); + public string? MlInstalledVersion + { + get + { + foreach (var sub in new[] { "net35", "net6" }) + { + var dll = Path.Combine(Paths.GameDir(Info), "MelonLoader", sub, "MelonLoader.dll"); + if (!File.Exists(dll)) continue; + var v = System.Diagnostics.FileVersionInfo.GetVersionInfo(dll).ProductVersion?.Split('+', '-')[0]; + if (!string.IsNullOrEmpty(v)) return v; + } + return null; + } + } + + public ModAssignment? MlAssignment => Info.Mods.FirstOrDefault(m => m.ModId == ModDef.MelonLoaderId); + + public string MlText + { + get + { + var a = MlAssignment; + var installed = MlInstalledVersion is { } iv ? $" · files are v{iv}" : ""; + if (MlPresent) return (a is { Enabled: true } ? $"MelonLoader enabled · managed {a.Version}" : "MelonLoader enabled · not managed by this app") + installed; + if (MlOffPresent) return "MelonLoader disabled · version.dll renamed to version.dll.off"; + return a != null ? "MelonLoader disabled" : "No MelonLoader"; + } + } + + public string MlToggleText => MlPresent ? "Disable MelonLoader" : "Enable MelonLoader"; + public IEnumerable MlVersions => Main.MelonLoader.Releases.Select(r => r.Tag); + + public string? MlVersionChoice + { + get => mlVersionChoice + ?? (MlAssignment is { } a && a.Version != "latest" ? a.Version : null) + ?? (MlInstalledVersion is { } v ? Main.MelonLoader.Releases.Select(r => r.Tag).FirstOrDefault(t => t.TrimStart('v') == v) : null); + set { if (Set(ref mlVersionChoice, value)) Raise(); } + } + + public IEnumerable AddableMods => Main.ModCatalog + .Where(m => m.Id != ModDef.MelonLoaderId && Info.Mods.All(a => a.ModId != m.Id)); + + public ModDef? AddChoice { get => addChoice; set => Set(ref addChoice, value); } + + void AddMod() + { + if (AddChoice == null) return; + var a = new ModAssignment { ModId = AddChoice.Id }; + Info.Mods.Add(a); + Mods.Add(new AssignmentVM(this, a, AddChoice)); + AddChoice = null; + Raise(nameof(AddableMods)); + MarkPending(); + } + + public void RemoveAssignment(AssignmentVM vm) + { + Info.Mods.Remove(vm.Info); + Mods.Remove(vm); + Raise(nameof(AddableMods)); + MarkPending(true); + } + + public void MarkPending(bool force = false) + { + Pending = true; + Main.Save(); + Main.NotifyAssignments(); + } + + public void ClearPending() => Pending = false; + + public void RebuildHooks() + { + Hooks.Clear(); + foreach (var h in Main.HookCatalog) Hooks.Add(new InstallHookVM(this, h)); + } + + public void Rebuild() + { + RebuildHooks(); + Mods.Clear(); + foreach (var a in Info.Mods.Where(a => a.ModId != ModDef.MelonLoaderId).ToList()) + { + var mod = Main.ModCatalog.FirstOrDefault(m => m.Id == a.ModId); + if (mod != null) Mods.Add(new AssignmentVM(this, a, mod)); + } + Refresh(); + } + + public void Refresh() + { + InstalledBuild = AppManifest.LocalBuildId(Info); + InstalledBranch = AppManifest.LocalBranch(Info); + CacheText = CacheService.GetState(Info) switch + { + CacheState.Shared => "Cache: shared (junction to the shared cache)", + CacheState.Local => "Cache: stored inside this install, not shared", + CacheState.LinkedElsewhere => "Cache: linked to a folder other than the shared cache", + _ => "Cache: not created yet", + }; + Raise(nameof(HasGame)); + RaiseStatus(); + Raise(nameof(MlText)); + Raise(nameof(MlToggleText)); + Raise(nameof(MlVersions)); + Raise(nameof(MlVersionChoice)); + Raise(nameof(AddableMods)); + Raise(nameof(BranchHint)); + foreach (var m in Mods) m.RefreshVersions(); + } +} + +public class ReleaseRow +{ + public ReleaseRow(ModDef mod, ReleaseInfo release) + { + Tag = release.Tag; + var parts = new List { release.Tag + (release.Prerelease ? " (pre-release)" : "") }; + if (release.Published != default) parts.Add(release.Published.ToString("yyyy-MM-dd")); + if (release.GameVersion.Length > 0) parts.Add("game " + release.GameVersion); + if (release.LoaderVersion.Length > 0) parts.Add("MelonLoader " + release.LoaderVersion); + if (release.Snapshot) parts.Add("the file from your install"); + parts.Add(ModStore.IsDownloaded(mod, release.Tag) ? "downloaded" : "not downloaded"); + Text = string.Join(" · ", parts); + } + + public string Tag { get; } + public string Text { get; } +} + +public class SourceVM : ObservableObject +{ + readonly MainViewModel main; + public MainViewModel Main => main; + public SourceDef Info { get; } + + public SourceVM(MainViewModel main, SourceDef info) + { + this.main = main; + Info = info; + RemoveCommand = new RelayCommand(() => main.RemoveSource(this)); + } + + public ObservableCollection Mods { get; } = new(); + string filter = ""; + public string Filter { get => filter; set { if (Set(ref filter, value)) Raise(nameof(VisibleMods)); } } + public IEnumerable VisibleMods => Mods.Where(m => filter.Trim().Length == 0 + || m.Name.Contains(filter.Trim(), StringComparison.OrdinalIgnoreCase) + || m.Info.Author.Contains(filter.Trim(), StringComparison.OrdinalIgnoreCase) + || m.Info.Description.Contains(filter.Trim(), StringComparison.OrdinalIgnoreCase)); + + public void SetMods(IEnumerable mods) + { + Mods.Clear(); + foreach (var m in mods) Mods.Add(m); + Raise(nameof(VisibleMods)); + } + + public string Name => Info.Name; + public string Detail => Info.Kind == "cvrmg" ? "cvrmg.com" : $"github.com/{Info.Repo}"; + public bool CanRemove => !Info.Builtin || Info.Kind != "cvrmg"; + public ICommand RemoveCommand { get; } + int count = -1; + public int Count { get => count; set { if (Set(ref count, value)) Raise(nameof(CountText)); } } + public string CountText => count < 0 ? "loading..." : $"{count} mods"; + public string Kind => Info.Kind == "cvrmg" ? "CVRMG" : "GitHub releases"; + public string Link => Info.Kind == "cvrmg" ? "https://cvrmg.com" : $"https://github.com/{Info.Repo}"; +} + +public class GroupHeader : ObservableObject +{ + readonly Action toggle; + bool expanded = true; + + public GroupHeader(string title, int count, bool expanded, Action toggle) + { + Title = title; + Count = count; + this.expanded = expanded; + this.toggle = toggle; + ToggleCommand = new RelayCommand(() => this.toggle(this)); + } + + public string Title { get; } + public int Count { get; } + public bool Expanded => expanded; + public string Text => $"{(expanded ? "▾" : "▸")} {Title} ({Count})"; + public ICommand ToggleCommand { get; } +} + +public class ModVM : ObservableObject +{ + public MainViewModel Main { get; } + public ModDef Info { get; } + public ObservableCollection Releases { get; } = new(); + ReleaseRow? selected; + + public static string[] Types { get; } = { "Mods", "Plugins", "UserLibs", "Root" }; + + public ModVM(MainViewModel main, ModDef info) + { + Main = main; + Info = info; + RefreshCommand = new RelayCommand(() => Main.RefreshModAsync(this)); + DownloadCommand = new RelayCommand(() => Main.DownloadModAsync(this)); + DeleteDownloadCommand = new RelayCommand(() => Main.DeleteModDownloadAsync(this)); + RemoveCommand = new RelayCommand(() => Main.RemoveModAsync(this)); + AddLocalCommand = new RelayCommand(() => Main.AddLocalFilesAsync(this)); + ManageCommand = new RelayCommand(() => Main.ManagedMod = this); + Rebuild(); + } + + static readonly Dictionary FileVersions = new(); + + string? FileVersionOf(string tag) + { + var dir = Paths.ModFilesDir(Info, tag); + if (!ModStore.IsDownloaded(Info, tag) || !Directory.Exists(dir)) return null; + if (FileVersions.TryGetValue(dir, out var cached)) return cached; + var dll = Directory.EnumerateFiles(dir, "*.dll", SearchOption.AllDirectories) + .OrderBy(f => ModImportService.Norm(Path.GetFileName(f)) == ModImportService.Norm(Info.FileName) ? 0 : 1).FirstOrDefault(); + return FileVersions[dir] = dll == null ? "" : AssemblyReader.Read(dll).Version; + } + + string InstalledVersion + { + get + { + if (Assignment is not { Enabled: true } a) return ""; + var tag = ModStore.ResolveTag(Info, a.Version); + var rel = Info.Releases.FirstOrDefault(r => r.Tag == tag); + if (rel?.Snapshot == true) + { + var i = tag.IndexOf(" (", StringComparison.Ordinal); + return tag.StartsWith("installed ", StringComparison.Ordinal) ? tag[10..(i > 10 ? i : tag.Length)] : tag; + } + var fromFile = FileVersionOf(tag); + return string.IsNullOrEmpty(fromFile) ? "" : fromFile; + } + } + + public string InstalledText + { + get + { + if (Assignment is not { Enabled: true } a) return "—"; + var v = InstalledVersion; + return v.Length > 0 ? v : ModStore.ResolveTag(Info, a.Version) is { Length: > 0 } t ? t : "—"; + } + } + + ReleaseInfo? Newest => Info.Releases.FirstOrDefault(r => !r.Snapshot && !r.Prerelease) ?? Info.Releases.FirstOrDefault(r => !r.Snapshot); + public string LatestText => Info.LatestVersion.Length > 0 ? Info.LatestVersion : "—"; + + static int CompareVersions(string a, string b) + { + a = a.Trim().TrimStart('v', 'V'); + b = b.Trim().TrimStart('v', 'V'); + if (Version.TryParse(a, out var x) && Version.TryParse(b, out var y)) + return (x.Major, x.Minor, Math.Max(x.Build, 0), Math.Max(x.Revision, 0)).CompareTo((y.Major, y.Minor, Math.Max(y.Build, 0), Math.Max(y.Revision, 0))); + + var ca = System.Text.RegularExpressions.Regex.Matches(a, @"\d+|\D+"); + var cb = System.Text.RegularExpressions.Regex.Matches(b, @"\d+|\D+"); + for (var i = 0; i < Math.Min(ca.Count, cb.Count); i++) + { + var pa = ca[i].Value; + var pb = cb[i].Value; + var c = char.IsDigit(pa[0]) && char.IsDigit(pb[0]) + ? System.Numerics.BigInteger.Parse(pa).CompareTo(System.Numerics.BigInteger.Parse(pb)) + : string.Compare(pa, pb, StringComparison.OrdinalIgnoreCase); + if (c != 0) return c; + } + return ca.Count.CompareTo(cb.Count); + } + + public bool UpdateAvailable + { + get + { + if (Assignment is not { Enabled: true } a) return false; + var installed = InstalledVersion; + if (installed.Length > 0 && Info.LatestVersion.Length > 0) return CompareVersions(Info.LatestVersion, installed) > 0; + if (Newest == null) return false; + var tag = ModStore.ResolveTag(Info, a.Version); + var rel = Info.Releases.FirstOrDefault(r => r.Tag == tag); + return rel is { Snapshot: false } && tag != Newest.Tag; + } + } + + public string StatusText => Assignment is not { Enabled: true } ? "" : UpdateAvailable ? "Update available" : "Installed"; + public string ShortDescription => Info.Description.Split('\n')[0].Trim(); + public string AuthorLine => string.Join(" · ", new[] { Info.Author, Info.Source == "cvrmg" ? "CVRMG" : Info.Source == "github" ? Info.Repo : "local" }.Where(x => x.Length > 0)); + public string CategoryText => Info.Category.Length > 0 ? Info.Category : Info.Source == "local" ? "Local files" : "Uncategorized"; + + InstallVM? Current => Main.SelectedInstall; + ModAssignment? Assignment => Current?.Info.Mods.FirstOrDefault(a => a.ModId == Info.Id); + public bool HasInstall => Current != null; + public bool InstallAssigned => Assignment != null; + + public bool InCatalog => Main.IsInCatalog(Info); + + public bool InstallUsed + { + get => Assignment is { Enabled: true }; + set + { + var cur = Current; + if (cur == null) return; + Main.EnsureInCatalog(this); + var a = Assignment; + if (value) + { + if (a == null) cur.Info.Mods.Add(a = new ModAssignment { ModId = Info.Id }); + a.Enabled = true; + } + else if (a != null) a.Enabled = false; + cur.Rebuild(); + cur.MarkPending(); + } + } + + public IEnumerable VersionChoices => new[] { "latest" }.Concat(Info.Releases.Select(r => r.Tag)).Distinct().ToList(); + + public string InstallVersion + { + get => Assignment?.Version ?? "latest"; + set + { + if (value == null || Current == null) return; + Main.EnsureInCatalog(this); + var a = Assignment; + if (a == null) Current.Info.Mods.Add(a = new ModAssignment { ModId = Info.Id }); + if (a.Version == value && a.Enabled) return; + a.Version = value; + a.Enabled = true; + Current!.Rebuild(); + Current.MarkPending(); + } + } + + public void RefreshUsedBy() => Raise(nameof(UsedBy)); + + public void NotifyInstall() + { + Raise(nameof(HasInstall)); + Raise(nameof(InstallAssigned)); + Raise(nameof(InstallUsed)); + Raise(nameof(VersionChoices)); + Raise(nameof(InstallVersion)); + Raise(nameof(ToggleInstallText)); + Raise(nameof(InstalledText)); + Raise(nameof(LatestText)); + Raise(nameof(UpdateAvailable)); + Raise(nameof(StatusText)); + Raise(nameof(ShortDescription)); + } + + public ICommand ToggleInstallCommand => new RelayCommand(() => InstallUsed = !InstallUsed); + public string ToggleInstallText => InstallUsed ? "Remove from install" : "Add to install"; + + public ICommand RefreshCommand { get; } + public ICommand DownloadCommand { get; } + public ICommand DeleteDownloadCommand { get; } + public ICommand RemoveCommand { get; } + public ICommand AddLocalCommand { get; } + public ICommand ManageCommand { get; } + + public string Name + { + get => Info.Name; + set { if (Info.Name != value) { Info.Name = value; Raise(); Main.Save(); } } + } + + public string Type + { + get => Info.Type; + set { if (value != null && Info.Type != value) { Info.Type = value; Raise(); Main.Save(); } } + } + + public string AssetFilter + { + get => Info.AssetFilter; + set { if (Info.AssetFilter != value) { Info.AssetFilter = value; Raise(); Main.Save(); } } + } + + public bool IsLocal => Info.Source == "local"; + public bool IsBuiltin => Info.Id == ModDef.MelonLoaderId; + public bool CanRemove => !IsBuiltin; + public string Source => Info.Source switch + { + "cvrmg" => $"CVRMG #{Info.CvrmgId}", + "local" => "Local files", + _ => $"github.com/{Info.Repo}", + }; + + public IEnumerable SourceOptions => new[] { Info.Repo.Length > 0 && !Info.Local ? "GitHub" : "", Info.CvrmgId > 0 ? "CVRMG" : "" }.Where(x => x.Length > 0); + public bool HasSourceChoice => SourceOptions.Count() > 1; + + public string? SelectedSource + { + get => Info.Source switch { "cvrmg" => "CVRMG", "github" => "GitHub", _ => null }; + set + { + if (value == null) return; + var s = value == "CVRMG" ? "cvrmg" : "github"; + if (s != Info.Source) _ = Main.SwitchSourceAsync(this, s); + } + } + + public string Details + { + get + { + var parts = new List(); + if (Info.Source == "cvrmg" || Info.CvrmgId > 0) parts.Add("on CVRMG"); + if (Info.Author.Length > 0) parts.Add("by " + Info.Author); + if (Info.Category.Length > 0) parts.Add(Info.Category); + if (Info.Status.Length > 0 && Info.Status != "approved") parts.Add($"CVRMG status: {Info.Status}"); + if (Info.SourceLink.Length > 0) parts.Add(Info.SourceLink); + return string.Join(" · ", parts); + } + } + + public string Description => Info.Description.Length > 600 ? Info.Description[..600] + "..." : Info.Description; + public bool HasDescription => Info.Description.Length > 0; + public ReleaseRow? SelectedRelease { get => selected; set => Set(ref selected, value); } + + public string UsedBy + { + get + { + var lines = Main.Installs + .Select(i => (i, a: i.Info.Mods.FirstOrDefault(m => m.ModId == Info.Id))) + .Where(x => x.a != null) + .Select(x => $"{x.i.Info.Name} ({x.i.Info.Branch}): {(x.a!.Enabled ? "" : "disabled, ")}{x.a.Version}") + .ToList(); + return lines.Count == 0 ? "Not used by any install" : string.Join("\n", lines); + } + } + + public void Rebuild() + { + var keep = SelectedRelease?.Tag; + Releases.Clear(); + foreach (var r in Info.Releases) Releases.Add(new ReleaseRow(Info, r)); + if (Info.Local && Info.Releases.Count == 0) Releases.Add(new ReleaseRow(Info, new ReleaseInfo { Tag = "local" })); + SelectedRelease = Releases.FirstOrDefault(r => r.Tag == keep) ?? Releases.FirstOrDefault(); + Raise(nameof(UsedBy)); + Raise(nameof(Name)); + Raise(nameof(Source)); + Raise(nameof(SelectedSource)); + Raise(nameof(Details)); + Raise(nameof(Description)); + NotifyInstall(); + } +} + + +public class InstallHookVM : ObservableObject +{ + readonly InstallVM owner; + public HookDef Hook { get; } + + public InstallHookVM(InstallVM owner, HookDef hook) + { + this.owner = owner; + Hook = hook; + RunCommand = new RelayCommand(() => owner.Main.RunHookAsync(owner, hook)); + } + + public string Name => Hook.Name; + + public string When + { + get + { + var parts = new List(); + if (Hook.BeforeUpdate) parts.Add("before update"); + if (Hook.AfterUpdate) parts.Add("after install / update"); + if (Hook.BeforeLaunch) parts.Add("before launch"); + return parts.Count == 0 ? "manual only" : string.Join(", ", parts); + } + } + + public bool Enabled + { + get => owner.Info.HookIds.Contains(Hook.Id); + set + { + if (Enabled == value) return; + if (value) owner.Info.HookIds.Add(Hook.Id); + else owner.Info.HookIds.Remove(Hook.Id); + Raise(); + owner.Main.Save(); + } + } + + public ICommand RunCommand { get; } +} + +public class AccountVM : ObservableObject +{ + public MainViewModel Main { get; } + public GameAccount Info { get; } + + public AccountVM(MainViewModel main, GameAccount info) + { + Main = main; + Info = info; + RemoveCommand = new RelayCommand(() => Main.RemoveAccountAsync(this)); + } + + public ICommand RemoveCommand { get; } + public string Username => Info.Username; + + public string Name + { + get => Info.Name; + set + { + var name = value.Trim(); + if (name.Length == 0 || Info.Name == name) return; + Info.Name = name; + Raise(); + Main.AccountsChanged(); + } + } +} + +public class HookVM : ObservableObject +{ + public MainViewModel Main { get; } + public HookDef Info { get; } + + public HookVM(MainViewModel main, HookDef info) + { + Main = main; + Info = info; + RemoveCommand = new RelayCommand(() => Main.RemoveHookAsync(this)); + } + + public ICommand RemoveCommand { get; } + + public bool CanRemove => true; + + public string Name + { + get => Info.Name; + set { if (Info.Name != value) { Info.Name = value; Raise(); Main.HooksChanged(); } } + } + + public string Command + { + get => Info.Command; + set { if (Info.Command != value) { Info.Command = value; Raise(); Main.Save(); } } + } + + public string Arguments + { + get => Info.Arguments; + set { if (Info.Arguments != value) { Info.Arguments = value; Raise(); Main.Save(); } } + } + + public bool BeforeUpdate { get => Info.BeforeUpdate; set { if (Info.BeforeUpdate != value) { Info.BeforeUpdate = value; Raise(); Main.HooksChanged(); } } } + public bool AfterUpdate { get => Info.AfterUpdate; set { if (Info.AfterUpdate != value) { Info.AfterUpdate = value; Raise(); Main.HooksChanged(); } } } + public bool BeforeLaunch { get => Info.BeforeLaunch; set { if (Info.BeforeLaunch != value) { Info.BeforeLaunch = value; Raise(); Main.HooksChanged(); } } } + public bool DefaultOn { get => Info.DefaultOn; set { if (Info.DefaultOn != value) { Info.DefaultOn = value; Raise(); Main.Save(); } } } +} diff --git a/ViewModels/MainViewModel.cs b/ViewModels/MainViewModel.cs new file mode 100644 index 0000000..4c63708 --- /dev/null +++ b/ViewModels/MainViewModel.cs @@ -0,0 +1,1638 @@ +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Text; +using System.Windows.Input; +using Avalonia.Threading; +using CVRManager.Models; +using CVRManager.Services; + +namespace CVRManager.ViewModels; + +public class MainViewModel : ObservableObject +{ + readonly AppConfig cfg; + readonly GitHubService github; + readonly ModStore store; + readonly CvrmgService cvrmg = new(); + readonly ModImportService importer; + readonly StringBuilder log = new(); + CancellationTokenSource? cts; + + bool busy; + string status = "Ready"; + double progress; + bool indeterminate; + InstallVM? selectedInstall; + ModVM? selectedMod; + bool showNew; + string newName = ""; + BranchChoice? newChoice; + string? newImportPath; + bool newMoveCache = true; + bool newDownload = true; + string addModRepo = ""; + string cacheSize = ""; + + public Func>? PickFolder { get; set; } + public Func>>? PickFiles { get; set; } + public Func>? Confirm { get; set; } + public Func? CopyImage { get; set; } + public GalleryViewModel Gallery { get; } + public void ReportStatus(string text) => Status = text; + + public MainViewModel() + { + cfg = ConfigStore.Load(); + ThemeService.Apply(cfg.Theme); + github = new GitHubService(() => cfg.GitHubToken); + store = new ModStore(github); + importer = new ModImportService(github, cvrmg); + Gallery = new GalleryViewModel(this); + + foreach (var m in cfg.Mods) Mods.Add(new ModVM(this, m)); + foreach (var h in cfg.Hooks) Hooks.Add(new HookVM(this, h)); + foreach (var a in cfg.Accounts) Accounts.Add(new AccountVM(this, a)); + RebuildAccountChoices(); + foreach (var src in cfg.Sources) Sources.Add(new SourceVM(this, src)); + AvailableMods = Mods.ToList(); + selectedSource = Sources.FirstOrDefault(); + Mods.CollectionChanged += (_, _) => RegroupMods(); + RegroupMods(); + foreach (var i in cfg.Installs) Installs.Add(new InstallVM(this, i)); + RebuildChoices(); + newChoice = BranchChoices.FirstOrDefault(c => c.Name == "public"); + Installs.CollectionChanged += (_, _) => { Raise(nameof(NoInstalls)); Raise(nameof(ShowDetail)); }; + selectedInstall = Installs.FirstOrDefault(); + selectedMod = Mods.FirstOrDefault(m => m.Info.Id != ModDef.MelonLoaderId); + + CreateInstallCommand = new RelayCommand(CreateInstallAsync); + ShowNewCommand = new RelayCommand(() => { ShowNew = true; NewImport = false; DetectExisting(); }); + CancelNewCommand = new RelayCommand(() => ShowNew = false); + RefreshBranchesCommand = new RelayCommand(RefreshBranchesAsync); + CancelCommand = new RelayCommand(() => cts?.Cancel()); + AddModCommand = new RelayCommand(AddModAsync); + AddLocalNewCommand = new RelayCommand(AddLocalFilesNewAsync); + RefreshAllModsCommand = new RelayCommand(RefreshAllModsAsync); + DedupeCommand = new RelayCommand(DedupeAllAsync); + ApplyLibraryRootCommand = new RelayCommand(ApplyLibraryRoot); + BrowseLibraryRootCommand = new RelayCommand(BrowseLibraryRootAsync); + BrowseImportCommand = new RelayCommand(BrowseImportAsync); + OpenLibraryCommand = new RelayCommand(() => Explorer(Paths.Root)); + OpenCacheCommand = new RelayCommand(() => Explorer(Paths.SharedCache)); + OpenModStoreCommand = new RelayCommand(() => Explorer(Paths.ModStore)); + + var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; + timer.Tick += (_, _) => { if (IsInstallsPage) SelectedInstall?.RefreshLogs(); }; + timer.Start(); + + Log($"Library: {Paths.Root}"); + _ = StartupAsync(); + } + + public ObservableCollection Installs { get; } = new(); + public ObservableCollection Mods { get; } = new(); + public ObservableCollection Hooks { get; } = new(); + public ObservableCollection Accounts { get; } = new(); + public ObservableCollection AccountChoices { get; } = new(); + public bool HasAccounts => Accounts.Count > 0; + string newAccountUser = ""; + string newAccountKey = ""; + + public string NewAccountUser { get => newAccountUser; set => Set(ref newAccountUser, value); } + public string NewAccountKey { get => newAccountKey; set => Set(ref newAccountKey, value); } + + public void RebuildAccountChoices() + { + AccountChoices.Clear(); + AccountChoices.Add(new AccountChoice("", "Game login")); + foreach (var a in cfg.Accounts) AccountChoices.Add(new AccountChoice(a.Id, a.Name)); + Raise(nameof(HasAccounts)); + foreach (var i in Installs) i.RaiseAccount(); + } + + public void AccountsChanged() + { + Save(); + RebuildAccountChoices(); + } + + GameAccount AddAccount(string name, string username, string userId, string key) + { + var a = new GameAccount { Name = name, Username = username, UserId = userId, AccessKey = TokenVault.Protect(key) }; + cfg.Accounts.Add(a); + Accounts.Add(new AccountVM(this, a)); + return a; + } + + public ICommand AddAccountCommand => new RelayCommand(() => + { + var user = NewAccountUser.Trim(); + var key = NewAccountKey.Trim(); + if (user.Length == 0 || key.Length == 0) { Status = "Enter a username and an access key."; return; } + AddAccount(user, user, "", key); + NewAccountUser = NewAccountKey = ""; + AccountsChanged(); + }); + + public ICommand ImportAccountsCommand => new RelayCommand(async () => + { + var dirs = cfg.Installs.Select(Paths.GameDir).ToList(); + var found = await Task.Run(() => AccountService.Scan(dirs).ToList()); + var known = cfg.Accounts.Select(a => (a.Username, TokenVault.Unprotect(a.AccessKey))).ToHashSet(); + var added = 0; + foreach (var f in found) + { + if (!known.Add((f.Username, f.AccessKey))) continue; + AddAccount(f.Name, f.Username, f.UserId, f.AccessKey); + added++; + } + Status = added == 0 ? "No new accounts found." : $"Imported {added} account{(added == 1 ? "" : "s")}."; + if (added > 0) AccountsChanged(); + }); + + public async Task RemoveAccountAsync(AccountVM vm) + { + if (Confirm != null && !await Confirm($"Remove the account '{vm.Info.Name}'?")) return; + cfg.Accounts.Remove(vm.Info); + Accounts.Remove(vm); + foreach (var i in cfg.Installs.Where(i => i.AccountId == vm.Info.Id)) i.AccountId = ""; + AccountsChanged(); + } + public IEnumerable HookCatalog => cfg.Hooks; + string? hookWarning; + + public void HooksChanged() + { + Save(); + foreach (var i in Installs) i.RebuildHooks(); + } + + public ICommand AddHookCommand => new RelayCommand(() => + { + var def = new HookDef { Name = "New hook" }; + cfg.Hooks.Add(def); + Hooks.Add(new HookVM(this, def)); + foreach (var i in Installs) if (def.DefaultOn) i.Info.HookIds.Add(def.Id); + HooksChanged(); + }); + + public async Task RemoveHookAsync(HookVM vm) + { + if (!vm.CanRemove) return; + if (Confirm != null && !await Confirm($"Remove the hook '{vm.Info.Name}'?")) return; + cfg.Hooks.Remove(vm.Info); + Hooks.Remove(vm); + foreach (var i in Installs) i.Info.HookIds.Remove(vm.Info.Id); + HooksChanged(); + } + + public Task RunHookAsync(InstallVM vm, HookDef hook) => Run($"Running {hook.Name} on {vm.Info.Name}", async ct => + { + if (!await HookService.RunAsync(hook, vm.Info, vm.InstalledBuild, Log, ct)) + throw new InvalidOperationException($"{hook.Name} reported problems; see the activity log in Settings."); + }); + + async Task RunHooksAsync(InstallVM vm, string evt, CancellationToken ct) + { + var failed = await HookService.RunEventAsync(cfg.Hooks, vm.Info, evt, AppManifest.LocalBuildId(vm.Info), Log, ct); + if (failed.Count > 0) hookWarning = $"hook problems: {string.Join(", ", failed)} (see the activity log in Settings)"; + } + public ObservableCollection Branches { get; } = new(); + public ObservableCollection BranchChoices { get; } = new(); + public ObservableCollection DetectedInstalls { get; } = new(); + public bool HasDetected => DetectedInstalls.Count > 0; + + public IEnumerable ModCatalog => cfg.Mods; + public ModDef MelonLoader => cfg.Mods.First(m => m.Id == ModDef.MelonLoaderId); + + public ICommand CreateInstallCommand { get; } + public ICommand ShowNewCommand { get; } + public ICommand CancelNewCommand { get; } + public ICommand RefreshBranchesCommand { get; } + public ICommand CancelCommand { get; } + public ICommand AddModCommand { get; } + public ICommand AddLocalNewCommand { get; } + public ICommand RefreshAllModsCommand { get; } + public ICommand DedupeCommand { get; } + public ICommand ApplyLibraryRootCommand { get; } + public ICommand BrowseLibraryRootCommand { get; } + public ICommand BrowseImportCommand { get; } + public ICommand OpenLibraryCommand { get; } + public ICommand OpenCacheCommand { get; } + public ICommand OpenModStoreCommand { get; } + + string page = "installs"; + public bool IsInstallsPage { get => page == "installs"; set { if (value) SetPage("installs"); } } + public bool IsModsPage { get => page == "mods"; set { if (value) SetPage("mods"); } } + public bool IsSettingsPage { get => page == "settings"; set { if (value) SetPage("settings"); } } + public bool IsGalleryPage + { + get => page == "gallery"; + set + { + if (!value) return; + SetPage("gallery"); + if (Gallery.Items.Count == 0) _ = Gallery.RefreshAsync(); + } + } + + void SetPage(string p) + { + if (page == p) return; + page = p; + Raise(nameof(IsInstallsPage)); + Raise(nameof(IsModsPage)); + Raise(nameof(IsSettingsPage)); + Raise(nameof(IsGalleryPage)); + } + + public bool NoInstalls => Installs.Count == 0; + + public bool IsBusy { get => busy; private set { if (Set(ref busy, value)) Raise(nameof(IsIdle)); } } + public bool IsIdle => !busy; + public string Status + { + get => status; + private set + { + status = value; + Raise(); + ShowToast(value); + } + } + + bool toastVisible; + bool toastError; + int toastToken; + public bool ToastVisible { get => toastVisible; private set => Set(ref toastVisible, value); } + public bool ToastError { get => toastError; private set => Set(ref toastError, value); } + + void ShowToast(string text, bool error = false) + { + if (text == "Ready") return; + ToastError = error; + ToastVisible = true; + var token = ++toastToken; + if (error) return; + _ = Task.Run(async () => + { + await Task.Delay(5000); + Dispatcher.UIThread.Post(() => { if (token == toastToken && !IsBusy) ToastVisible = false; }); + }); + } + + public ICommand DismissToastCommand => new RelayCommand(() => ToastVisible = false); + + bool showCode, codeBusy; + string codeText = "", codeError = ""; + InstallVM? codeTarget; + public bool ShowCodeEntry { get => showCode; private set => Set(ref showCode, value); } + public string CodeText { get => codeText; set => Set(ref codeText, value); } + public string CodeError { get => codeError; private set { if (Set(ref codeError, value)) Raise(nameof(HasCodeError)); } } + public bool HasCodeError => codeError.Length > 0; + public bool CodeBusy { get => codeBusy; private set { if (Set(ref codeBusy, value)) Raise(nameof(CodeIdle)); } } + public bool CodeIdle => !codeBusy; + public string CodeIntro => codeTarget != null + ? $"Unlocked branches are added and {codeTarget.Info.Name} switches to the first." + : "Unlocked branches are added and the first is selected."; + + public void BeginCodeEntry(InstallVM? install = null) + { + codeTarget = install; + CodeText = ""; + CodeError = ""; + Raise(nameof(CodeIntro)); + ShowCodeEntry = true; + } + + public ICommand CancelCodeCommand => new RelayCommand(() => { if (!CodeBusy) ShowCodeEntry = false; }); + public ICommand EnterCodeNewCommand => new RelayCommand(() => BeginCodeEntry()); + public ICommand SubmitCodeCommand => new RelayCommand(async () => + { + var code = CodeText.Trim(); + if (CodeBusy) return; + if (code.Length == 0) { CodeError = "Type the access code first."; return; } + if (!SteamSignedIn) { CodeError = "Sign in to Steam in Settings first; Steam only checks codes for a signed-in account."; return; } + CodeError = ""; + CodeBusy = true; + try + { + var names = await CheckCodeAsync(code); + ShowCodeEntry = false; + var pick = BranchChoices.FirstOrDefault(c => c.Name == names[0]); + if (pick == null) return; + if (codeTarget != null) codeTarget.BranchHint = pick; + else NewChoice = pick; + Status = names.Count == 1 ? $"Unlocked branch {names[0]}." : $"Unlocked {names.Count} branches; selected {names[0]}."; + } + catch (Exception e) + { + CodeError = e.Message; + Log($"Access code check failed: {e.Message}"); + } + finally { CodeBusy = false; } + }); + + bool showSignIn, signInNeedsCode; + string signInPassword = "", signInCode = "", signInPrompt = ""; + TaskCompletionSource? signInReply; + public bool ShowSignIn { get => showSignIn; private set => Set(ref showSignIn, value); } + bool signInWaiting; + public bool SignInNeedsCode { get => signInNeedsCode; private set { if (Set(ref signInNeedsCode, value)) Raise(nameof(SignInNeedsPassword)); } } + public bool SignInWaiting { get => signInWaiting; private set { if (Set(ref signInWaiting, value)) { Raise(nameof(SignInNeedsPassword)); Raise(nameof(SignInCanContinue)); } } } + public bool SignInNeedsPassword => !signInNeedsCode && !signInWaiting; + public bool SignInCanContinue => !signInWaiting; + public string SignInUser { get => cfg.SteamUser; set { if (cfg.SteamUser != value) { cfg.SteamUser = value.Trim(); Raise(); Save(); } } } + public string SignInPassword { get => signInPassword; set => Set(ref signInPassword, value); } + public string SignInCode { get => signInCode; set => Set(ref signInCode, value); } + public string SignInPrompt { get => signInPrompt; private set => Set(ref signInPrompt, value); } + public bool SteamSignedIn => !string.IsNullOrEmpty(cfg.SteamToken); + public string SteamAccountText => SteamSignedIn ? $"Signed in as {cfg.SteamUser}." : "Not signed in."; + + public ICommand SteamSignInCommand => new RelayCommand(async () => + { + SignInPassword = ""; + SignInCode = ""; + SignInNeedsCode = false; + SignInWaiting = false; + SignInPrompt = "Steam sign-in"; + ShowSignIn = true; + var pass = await WaitSignInAsync(); + if (pass == null) { ShowSignIn = false; return; } + SignInPrompt = "Signing in..."; + await Run("Steam sign-in", async ct => + { + async Task Ask(string prompt) + { + SignInCode = ""; + SignInPrompt = prompt; + SignInNeedsCode = true; + ShowSignIn = true; + return await WaitSignInAsync() ?? throw new OperationCanceledException(); + } + try + { + var token = await SteamLink.SignInAsync(cfg.SteamUser, pass, + () => Dispatcher.UIThread.Post(() => + { + SignInPrompt = "Approve on your Steam mobile app."; + SignInWaiting = true; + ShowSignIn = true; + }), + wrong => Ask(wrong ? "That Steam Guard code was wrong. Enter the code from your Steam mobile app" : "Enter the Steam Guard code from your Steam mobile app"), + (mail, wrong) => Ask($"{(wrong ? "That code was wrong. " : "")}Enter the Steam Guard code emailed to {mail}"), + ct); + cfg.SteamToken = TokenVault.Protect(token); + Save(); + Log($"Signed in to Steam as {cfg.SteamUser}."); + } + finally + { + ShowSignIn = false; + SignInNeedsCode = false; + SignInWaiting = false; + Raise(nameof(SteamSignedIn)); + Raise(nameof(SteamAccountText)); + } + }); + SignInPassword = ""; + }); + + Task WaitSignInAsync() + { + signInReply = new(TaskCreationOptions.RunContinuationsAsynchronously); + return signInReply.Task; + } + + public ICommand SubmitSignInCommand => new RelayCommand(() => + { + if (!SignInNeedsCode && !SignInWaiting && (string.IsNullOrWhiteSpace(cfg.SteamUser) || SignInPassword.Length == 0)) + { + SignInPrompt = "Enter both your Steam username and password."; + return; + } + var reply = SignInNeedsCode ? SignInCode.Trim() : SignInPassword; + SignInPassword = ""; + signInReply?.TrySetResult(reply); + }); + + public ICommand CancelSignInCommand => new RelayCommand(() => signInReply?.TrySetResult(null)); + + public ICommand SteamSignOutCommand => new RelayCommand(() => + { + cfg.SteamToken = ""; + Save(); + Raise(nameof(SteamSignedIn)); + Raise(nameof(SteamAccountText)); + }); + + bool newImport; + bool NewImportDone; + public bool NewImport { get => newImport; set => Set(ref newImport, value); } + public double Progress { get => progress; private set => Set(ref progress, value); } + public bool Indeterminate { get => indeterminate; private set => Set(ref indeterminate, value); } + public string LogText { get { lock (logLock) return log.ToString(); } } + readonly object logLock = new(); + bool logRaisePending; + + public InstallVM? SelectedInstall + { + get => selectedInstall; + set { if (Set(ref selectedInstall, value)) { Raise(nameof(HasSelectedInstall)); ShowNew = false; NotifyAssignments(); } } + } + public bool HasSelectedInstall => selectedInstall != null; + + public void RefreshModUsage() + { + foreach (var m in AvailableMods) m.RefreshUsedBy(); + } + + ModVM? managedMod; + public ModVM? ManagedMod { get => managedMod; set { if (Set(ref managedMod, value)) Raise(nameof(ShowManage)); } } + public bool ShowManage => managedMod != null; + public ICommand CloseManageCommand => new RelayCommand(() => ManagedMod = null); + + public void NotifyAssignments() + { + foreach (var m in AvailableMods.Concat(Mods).Distinct().ToList()) m.NotifyInstall(); + if (modFilter != "All mods") RegroupMods(); + } + + public ObservableCollection ModRows { get; } = new(); + public List AvailableMods { get; private set; } = new(); + readonly Dictionary transientMods = new(); + string availableStatus = "Loading mods from your sources..."; + public string AvailableStatus { get => availableStatus; private set => Set(ref availableStatus, value); } + + public bool IsInCatalog(ModDef def) => cfg.Mods.Contains(def); + + public void EnsureInCatalog(ModVM vm) + { + if (cfg.Mods.Contains(vm.Info)) return; + cfg.Mods.Add(vm.Info); + Mods.Add(vm); + Save(); + } + + static bool Matches(ModDef d, AvailableEntry e) + { + if (d.CvrmgId > 0 && e.Cvrmg != null && e.Cvrmg.Id == d.CvrmgId) return true; + if (d.Source == "github" && d.AssetFilter.Length > 0 && e.Keys.Contains(ModImportService.Norm(d.AssetFilter.Replace(".dll", "", StringComparison.OrdinalIgnoreCase)))) return true; + if (d.FileName.Length > 0 && e.Keys.Contains(ModImportService.Norm(Path.GetFileNameWithoutExtension(d.FileName)))) return true; + return e.Keys.Contains(ModImportService.Norm(d.Name)); + } + + ModDef BuildDef(AvailableEntry e) + { + var def = new ModDef { Name = e.Name, Type = e.Cvrmg?.ModType ?? "Mods" }; + if (e.Repos.FirstOrDefault() is { } o) + { + def.Source = "github"; + def.Repo = o.Repo; + def.AssetFilter = o.Asset; + def.FileName = o.Asset; + def.SourceLink = $"https://github.com/{o.Repo}"; + def.Releases = o.Releases; + } + else if (e.Cvrmg != null) + { + def.Source = "cvrmg"; + def.FileName = Paths.Safe(e.Cvrmg.Name) + ".dll"; + def.Releases = new List { CvrmgService.ToRelease(e.Cvrmg, def.FileName) }; + } + if (e.Cvrmg != null) CvrmgService.ApplyMeta(def, e.Cvrmg); + if (def.Category.Length == 0) def.Category = "Not on CVRMG"; + return def; + } + + public async Task RefreshAvailableAsync(bool force, CancellationToken ct = default) + { + AvailableStatus = "Loading mods from your sources..."; + List entries; + try + { + entries = await AvailableModsService.BuildAsync(cvrmg, importer, cfg.Sources, force, Log, ct); + } + catch (Exception e) when (e is not OperationCanceledException) + { + AvailableStatus = "Could not load sources: " + e.Message; + entries = new(); + } + + var vms = new List(); + var byEntry = new Dictionary(); + var claimed = new HashSet(); + foreach (var e in entries) + { + var existing = cfg.Mods.FirstOrDefault(d => d.Id != ModDef.MelonLoaderId && !claimed.Contains(d) && Matches(d, e)); + if (existing != null) + { + claimed.Add(existing); + if (e.Cvrmg != null) + { + if (existing.CvrmgId == 0) existing.CvrmgId = e.Cvrmg.Id; + if (existing.Category.Length == 0 || existing.Category == "Not on CVRMG") existing.Category = e.Cvrmg.Category; + if (existing.Description.Length == 0) existing.Description = e.Cvrmg.Description; + if (existing.Author.Length == 0) existing.Author = e.Cvrmg.Author; + existing.Status = e.Cvrmg.StatusText; + existing.LatestVersion = e.Cvrmg.ModVersion; + } + if (existing.Source == "github" && e.Repos.FirstOrDefault(o => o.Repo.Equals(existing.Repo, StringComparison.OrdinalIgnoreCase)) is { } offer) + existing.SetReleases(ModImportService.FilterReleases(offer.Releases, existing.AssetFilter)); + else if (existing.Source == "cvrmg" && e.Cvrmg != null) + existing.SetReleases(new List { CvrmgService.ToRelease(e.Cvrmg, existing.FileName.Length > 0 ? existing.FileName : Paths.Safe(e.Cvrmg.Name) + ".dll") }); + var vm = Mods.FirstOrDefault(v => v.Info == existing); + if (vm != null) { vms.Add(vm); byEntry[e] = vm; } + continue; + } + if (e.Cvrmg is { ApprovalStatus: 3 }) continue; + if (!transientMods.TryGetValue(e.Key, out var t)) transientMods[e.Key] = t = new ModVM(this, BuildDef(e)); + else + { + var fresh = BuildDef(e); + t.Info.Releases = fresh.Releases; + t.Info.Description = fresh.Description; + t.Info.LatestVersion = fresh.LatestVersion; + t.Info.Category = fresh.Category; + t.Info.Status = fresh.Status; + } + t.Rebuild(); + vms.Add(t); + byEntry[e] = t; + } + foreach (var vm in Mods.Where(v => v.Info.Id != ModDef.MelonLoaderId && !claimed.Contains(v.Info))) vms.Add(vm); + + foreach (var src in Sources) + { + var own = src.Info.Kind == "cvrmg" + ? entries.Where(e => e.Cvrmg != null) + : entries.Where(e => e.Repos.Any(o => o.Repo.Equals(src.Info.Repo, StringComparison.OrdinalIgnoreCase))); + src.SetMods(own.Select(e => byEntry.GetValueOrDefault(e)).Where(v => v != null).Select(v => v!).Distinct() + .OrderBy(v => v.Info.Name, StringComparer.OrdinalIgnoreCase)); + src.Count = src.Mods.Count; + } + + AvailableMods = vms; + foreach (var vm in Mods) vm.Rebuild(); + Save(); + AvailableStatus = $"{vms.Count} mods from {Sources.Count} sources"; + RegroupMods(); + } + readonly HashSet collapsedMods = new(); + bool regroupQueued; + string modSearch = ""; + string modFilter = "All mods"; + public static string[] ModFilters { get; } = { "All mods", "Installed", "Updates available" }; + + public string ModSearch { get => modSearch; set { if (Set(ref modSearch, value)) RegroupMods(); } } + public string ModFilter { get => modFilter; set { if (value != null && Set(ref modFilter, value)) RegroupMods(); } } + + public void RegroupMods() + { + if (regroupQueued) return; + regroupQueued = true; + Dispatcher.UIThread.Post(() => + { + regroupQueued = false; + var keep = selectedMod; + var q = modSearch.Trim(); + ModRows.Clear(); + var visible = AvailableMods.Where(m => m.Info.Id != ModDef.MelonLoaderId) + .Where(m => q.Length == 0 || m.Name.Contains(q, StringComparison.OrdinalIgnoreCase) || m.Info.Author.Contains(q, StringComparison.OrdinalIgnoreCase) || m.CategoryText.Contains(q, StringComparison.OrdinalIgnoreCase) || m.Info.Description.Contains(q, StringComparison.OrdinalIgnoreCase)) + .Where(m => modFilter switch { "Installed" => m.InstallUsed, "Updates available" => m.UpdateAvailable, _ => true }) + .GroupBy(m => m.CategoryText) + .OrderBy(g => g.Key is "Uncategorized" or "Local files" ? 1 : 0) + .ThenBy(g => g.Key, StringComparer.OrdinalIgnoreCase); + foreach (var g in visible) + { + ModRows.Add(new GroupHeader(g.Key, g.Count(), !collapsedMods.Contains(g.Key), h => { if (!collapsedMods.Remove(h.Title)) collapsedMods.Add(h.Title); RegroupMods(); })); + if (collapsedMods.Contains(g.Key)) continue; + foreach (var m in g.OrderBy(m => m.Info.Name, StringComparer.OrdinalIgnoreCase)) ModRows.Add(m); + } + if (keep != null && ModRows.Contains(keep)) selectedMod = keep; + Raise(nameof(SelectedRow)); + }); + } + + public object? SelectedRow + { + get => selectedMod; + set { if (value is ModVM m) SelectedMod = m; } + } + + public ModVM? SelectedMod + { + get => selectedMod; + set { if (Set(ref selectedMod, value)) { Raise(nameof(HasSelectedMod)); Raise(nameof(SelectedRow)); selectedMod?.Rebuild(); } } + } + public bool HasSelectedMod => selectedMod != null; + + public bool ShowNew { get => showNew; set { if (Set(ref showNew, value)) Raise(nameof(ShowDetail)); } } + public bool ShowDetail => Installs.Count > 0; + public string NewName { get => newName; set => Set(ref newName, value); } + public BranchChoice? NewChoice + { + get => newChoice; + set + { + if (value != null) Set(ref newChoice, value); + } + } + public string? NewImportPath { get => newImportPath; set => Set(ref newImportPath, value); } + public bool NewMoveCache { get => newMoveCache; set => Set(ref newMoveCache, value); } + public bool NewDownload { get => newDownload; set => Set(ref newDownload, value); } + + public string? NewDetected + { + get => NewImportPath; + set + { + NewImportPath = value; + if (value == null) return; + var found = SteamIntegration.FindExistingInstalls().FirstOrDefault(x => x.GameDir == value); + if (found.Manifest == null) return; + try + { + var state = Vdf.ParseDocument(File.ReadAllText(found.Manifest)).Dict("AppState"); + var branch = state?.Dict("UserConfig")?.Str("BetaKey"); + if (!string.IsNullOrEmpty(branch)) NewChoice = BranchChoices.FirstOrDefault(c => c.Name == branch) ?? AddChoice(new BranchChoice(branch, "")); + } + catch { } + Raise(); + } + } + + public string AddModRepo { get => addModRepo; set => Set(ref addModRepo, value); } + public string CacheSize { get => cacheSize; private set => Set(ref cacheSize, value); } + + public string LibraryRoot + { + get => cfg.LibraryRoot; + set { if (cfg.LibraryRoot != value) { cfg.LibraryRoot = value; Raise(); } } + } + + public bool CanChangeRoot => cfg.Installs.Count == 0; + + public string SteamUser + { + get => cfg.SteamUser; + set { if (cfg.SteamUser != value) { cfg.SteamUser = value; Raise(); Raise(nameof(SignInUser)); Save(); } } + } + + public bool CheckUpdates + { + get => cfg.CheckUpdates; + set { if (cfg.CheckUpdates != value) { cfg.CheckUpdates = value; Raise(); Save(); } } + } + + UpdateInfo? update; + string updateStatus = ""; + public string VersionText => $"CVR Manager {UpdateService.Current.ToString(3)}"; + public string UpdateStatus { get => updateStatus; private set => Set(ref updateStatus, value); } + public bool UpdateReady => update != null; + public string InstallUpdateText => update == null ? "" : $"Install {update.Tag}"; + public ICommand CheckUpdateCommand => new RelayCommand(() => CheckForUpdateAsync(true)); + public ICommand InstallUpdateCommand => new RelayCommand(InstallUpdateAsync); + + async Task CheckForUpdateAsync(bool manual) + { + if (manual) UpdateStatus = "Checking..."; + try + { + update = await UpdateService.CheckAsync(CancellationToken.None); + UpdateStatus = update != null ? $"{update.Tag} is available." : manual ? "Up to date." : ""; + if (update != null && !manual) ShowToast($"CVR Manager {update.Tag} is available. Install it in Settings."); + } + catch (Exception e) when (e is HttpRequestException or TaskCanceledException or System.Text.Json.JsonException) + { + update = null; + UpdateStatus = manual ? $"Could not check: {e.Message}" : ""; + } + Raise(nameof(UpdateReady)); + Raise(nameof(InstallUpdateText)); + } + + Task InstallUpdateAsync() + { + var info = update; + if (info == null) return Task.CompletedTask; + if (!UpdateService.CanWriteAppDir()) + { + UpdateStatus = "The app folder is read-only; move CVR Manager somewhere you can write to."; + return Task.CompletedTask; + } + return Run($"Updating to {info.Tag}", async ct => + { + var staged = await UpdateService.DownloadAsync(info, SetProgress, ct); + Save(); + UpdateService.ApplyAndRestart(staged); + Dispatcher.UIThread.Post(() => (Avalonia.Application.Current?.ApplicationLifetime as Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime)?.Shutdown()); + }); + } + + public bool CacheGuard + { + get => cfg.CacheGuard; + set { if (cfg.CacheGuard != value) { cfg.CacheGuard = value; Raise(); Save(); } } + } + + public IEnumerable ThemeNames => ThemeService.Names; + public string ThemeNote { get; private set; } = ""; + + public string Theme + { + get => cfg.Theme; + set + { + if (value == null || cfg.Theme == value) return; + cfg.Theme = value; + var ok = ThemeService.Apply(value); + ThemeNote = ok ? "" : "No saved in-game colours; using ChilloutVR."; + Raise(); + Raise(nameof(ThemeNote)); + Save(); + } + } + + public string GitHubToken + { + get => cfg.GitHubToken; + set { if (cfg.GitHubToken != value) { cfg.GitHubToken = value; Raise(); Save(); } } + } + + public string SteamClientText => SteamIntegration.IsRunning + ? "Steam is running." + : "Steam is started silently on launch."; + + public void Save() => ConfigStore.Save(cfg); + + public void Log(string line) + { + lock (logLock) + { + log.AppendLine(line); + if (log.Length > 60000) log.Remove(0, log.Length - 40000); + if (logRaisePending) return; + logRaisePending = true; + } + Dispatcher.UIThread.Post(async () => + { + await Task.Delay(150); + lock (logLock) logRaisePending = false; + Raise(nameof(LogText)); + }); + } + + void SetProgress(double p) => Dispatcher.UIThread.Post(() => { Indeterminate = false; Progress = p; }); + + async Task Run(string title, Func work) + { + if (IsBusy) { ToastVisible = true; return; } + IsBusy = true; + Status = title; + Indeterminate = true; + cts = new CancellationTokenSource(); + try + { + hookWarning = null; + await work(cts.Token); + if (hookWarning != null) + { + status = $"{title}: done, but {hookWarning}"; + Raise(nameof(Status)); + ShowToast(status, true); + } + else Status = $"{title}: done"; + } + catch (OperationCanceledException) + { + Status = $"{title}: cancelled"; + Log(Status); + } + catch (Exception e) + { + Log($"ERROR: {e.Message}"); + status = $"{title}: failed - {e.Message}"; + Raise(nameof(Status)); + ShowToast(status, true); + } + finally + { + Indeterminate = false; + Progress = 0; + IsBusy = false; + cts = null; + Save(); + foreach (var i in Installs) i.Refresh(); + foreach (var m in Mods) m.Rebuild(); + Raise(nameof(CanChangeRoot)); + } + } + + async Task StartupAsync() + { + DetectExisting(); + AdoptRunningGames(); + _ = RefreshAvailableAsync(false); + var cached = ConfigStore.LoadBranches(); + if (cached.Count > 0) + { + foreach (var b in cached) Branches.Add(b); + RebuildChoices(); + } + _ = RefreshBranchesQuietAsync(CancellationToken.None); + if (cfg.CheckUpdates) _ = CheckForUpdateAsync(false); + if (!IsBusy) await RefreshModCoreAsync(MelonLoader, quiet: true); + _ = Task.Run(() => + { + var size = FileOps.FormatSize(CacheService.SizeOf(Paths.SharedCache)); + Dispatcher.UIThread.Post(() => CacheSize = $"Shared cache size: {size}"); + }); + } + + BranchChoice AddChoice(BranchChoice c) + { + BranchChoices.Add(c); + return c; + } + + public void RebuildChoices() + { + var names = new List { new("public", "") }; + names.AddRange(Branches.Where(b => !b.PasswordRequired && b.Name != "public").Select(b => new BranchChoice(b.Name, ""))); + names.AddRange(cfg.Unlocked.Select(u => new BranchChoice(u.Name, u.Code))); + foreach (var i in cfg.Installs) + if (names.All(n => n.Name != i.Branch)) names.Add(new BranchChoice(i.Branch, i.BranchPassword)); + var keepNew = NewChoice?.Name; + BranchChoices.Clear(); + foreach (var n in names.DistinctBy(n => n.Name)) BranchChoices.Add(n); + newChoice = BranchChoices.FirstOrDefault(c => c.Name == keepNew) ?? BranchChoices.First(); + Raise(nameof(NewChoice)); + foreach (var i in Installs) i.Refresh(); + } + + async Task> CheckCodeAsync(string code) + { + var keys = await BranchCodeService.ResolveAsync(code, cfg.SteamUser, SteamToken, CancellationToken.None); + if (keys.Count == 0) throw new InvalidOperationException("That code does not unlock any ChilloutVR branch."); + foreach (var (n, key) in keys) + { + cfg.Unlocked.RemoveAll(u => u.Name == n); + cfg.Unlocked.Add(new UnlockedBranch { Name = n, Code = code, Key = BranchCodeService.ProtectKey(key) }); + } + Save(); + RebuildChoices(); + Log($"Access code unlocks: {string.Join(", ", keys.Keys)}"); + _ = RefreshBranchesQuietAsync(CancellationToken.None); + return keys.Keys.ToList(); + } + + void DetectExisting() + { + DetectedInstalls.Clear(); + foreach (var (game, _) in SteamIntegration.FindExistingInstalls()) DetectedInstalls.Add(game); + Raise(nameof(HasDetected)); + } + + public Task RefreshBranchesAsync() => Run("Refreshing branches", async ct => + { + var list = await SteamDownloader.GetBranchesAsync(cfg.SteamUser, SteamToken, PrivateBranches(), StoreBranchKey, Log, ct); + Branches.Clear(); + foreach (var b in list) Branches.Add(b); + ConfigStore.SaveBranches(list); + RebuildChoices(); + Log($"Branches: {string.Join(", ", list.Select(b => b.Name + (b.PasswordRequired ? " (password)" : "")))}"); + foreach (var i in Installs) i.Refresh(); + }); + + string SteamToken => TokenVault.Unprotect(cfg.SteamToken); + + void StoreBranchKey(string branch, byte[] key) + { + var entry = cfg.Unlocked.FirstOrDefault(u => u.Name == branch); + if (entry == null) return; + entry.Key = BranchCodeService.ProtectKey(key); + Dispatcher.UIThread.Post(Save); + } + + List PrivateBranches() => + cfg.Unlocked.Where(u => u.Code.Length > 0).Select(u => new SteamDownloader.PrivateBranch(u.Name, u.Code, BranchCodeService.UnprotectKey(u.Key))).ToList(); + + Task InstallFilesAsync(InstallInfo info, bool validate, CancellationToken ct) + { + var key = BranchCodeService.UnprotectKey(cfg.Unlocked.FirstOrDefault(u => u.Name == info.Branch)?.Key ?? ""); + return SteamDownloader.InstallAsync(Paths.GameDir(info), info.Branch, info.BranchPassword, key, StoreBranchKey, + cfg.SteamUser, SteamToken, validate, Log, SetProgress, ct); + } + + async Task CreateInstallAsync() + { + var name = NewName.Trim(); + if (name.Length == 0) { Status = "Give the install a name."; return; } + if (cfg.Installs.Any(i => i.Name.Equals(name, StringComparison.OrdinalIgnoreCase))) { Status = "An install with that name exists."; return; } + + var info = new InstallInfo + { + Name = name, + Branch = NewChoice?.Name ?? "public", + BranchPassword = NewChoice?.Code ?? "", + }; + info.Folder = InstallFolders.UniqueFolder(cfg.Installs, info, name); + info.HookIds = cfg.Hooks.Where(h => h.DefaultOn).Select(h => h.Id).ToList(); + var import = NewImport ? NewImportPath : null; + if (NewImport && string.IsNullOrWhiteSpace(import)) { Status = "Choose the folder to import."; return; } + var moveCache = NewMoveCache; + var download = !NewImport; + NewImportDone = NewImport; + + InstallVM? vm = null; + await Run($"Creating {name}", async ct => + { + Directory.CreateDirectory(Paths.GameDir(info)); + cfg.Installs.Add(info); + vm = new InstallVM(this, info); + Installs.Add(vm); + SelectedInstall = vm; + ShowNew = false; + Raise(nameof(CanChangeRoot)); + + if (!string.IsNullOrEmpty(import)) + { + Log($"Mirroring {import} into this install. The original is only read, never changed..."); + var cacheSrc = Path.Combine(import, "ChilloutVR_Data", "Cache"); + await Task.Run(() => FileOps.CopyTree(import, Paths.GameDir(info), + p => string.Equals(p, cacheSrc, StringComparison.OrdinalIgnoreCase), Log, ct), ct); + + var found = SteamIntegration.FindExistingInstalls().FirstOrDefault(x => x.GameDir == import); + if (found.Manifest != null) + { + Directory.CreateDirectory(Path.GetDirectoryName(Paths.Manifest(info))!); + File.Copy(found.Manifest, Paths.Manifest(info), true); + } + + if (moveCache && Directory.Exists(cacheSrc)) + { + Log("Copying the source cache into the shared cache (the original is left as it is)..."); + await Task.Run(() => CacheService.CopyInto(cacheSrc, Paths.SharedCache, Log, ct), ct); + } + } + + if (download) await InstallFilesAsync(info, true, ct); + if (Directory.Exists(Path.GetDirectoryName(Paths.CacheDir(info))!) || File.Exists(Paths.GameExe(info))) + await CacheService.LinkAsync(info, Log, ct); + if (NewImportDone) await ImportModsCoreAsync(info, ct); + if (File.Exists(Paths.GameExe(info))) await RunHooksAsync(vm, HookDef.AfterUpdateEvent, ct); + }); + vm?.Refresh(); + NewName = ""; + NewImportPath = null; + } + + public Task UpdateInstallAsync(InstallVM vm, bool validate) => Run($"Updating {vm.Info.Name}", async ct => + { + await RunHooksAsync(vm, HookDef.BeforeUpdateEvent, ct); + await InstallFilesAsync(vm.Info, validate, ct); + await CacheService.LinkAsync(vm.Info, Log, ct); + if (vm.Info.Mods.Count > 0) await store.ApplyAsync(vm.Info, cfg.Mods, Log, ct); + vm.ClearPending(); + await RunHooksAsync(vm, HookDef.AfterUpdateEvent, ct); + await RefreshBranchesQuietAsync(ct); + }); + + async Task RefreshBranchesQuietAsync(CancellationToken ct) + { + try + { + var list = await SteamDownloader.GetBranchesAsync(cfg.SteamUser, SteamToken, PrivateBranches(), StoreBranchKey, Log, ct); + Branches.Clear(); + foreach (var b in list) Branches.Add(b); + ConfigStore.SaveBranches(list); + RebuildChoices(); + } + catch (OperationCanceledException) { throw; } + catch (Exception e) { Log($"Branch refresh failed: {e.Message}"); } + } + + public Task LinkCacheAsync(InstallVM vm) => Run("Linking cache", async ct => + { + await CacheService.LinkAsync(vm.Info, Log, ct); + }); + + Task DedupeAllAsync() => Run("Deduplicating caches", async ct => + { + foreach (var i in Installs.Where(i => CacheService.GetState(i.Info) != CacheState.Missing).ToList()) + { + Log($"{i.Info.Name}: {CacheService.GetState(i.Info)}"); + await CacheService.LinkAsync(i.Info, Log, ct); + } + var size = await Task.Run(() => CacheService.SizeOf(Paths.SharedCache), ct); + CacheSize = $"Shared cache size: {FileOps.FormatSize(size)}"; + }); + + public void OpenFolder(InstallVM vm) + { + var path = Directory.Exists(Paths.GameDir(vm.Info)) ? Paths.GameDir(vm.Info) : Paths.InstallDir(vm.Info); + Directory.CreateDirectory(path); + Explorer(path); + } + + static void Explorer(string path) + { + Directory.CreateDirectory(path); + Process.Start(new ProcessStartInfo("explorer.exe", $"\"{path}\"") { UseShellExecute = true }); + } + + public void MoveInstall(InstallVM vm, int to) + { + var from = Installs.IndexOf(vm); + if (from < 0 || to < 0 || to >= Installs.Count || from == to) return; + Installs.Move(from, to); + cfg.Installs.RemoveAt(from); + cfg.Installs.Insert(to, vm.Info); + if (selectedInstall == vm) Raise(nameof(SelectedInstall)); + else SelectedInstall = vm; + } + + public Task DuplicateInstallAsync(InstallVM src) => Run($"Duplicating {src.Info.Name}", async ct => + { + var srcGame = Paths.GameDir(src.Info); + if (!Directory.Exists(srcGame) || !File.Exists(Paths.GameExe(src.Info))) + throw new InvalidOperationException("There is nothing to duplicate yet: this install has no game files."); + if (src.IsRunning || FindGameProcesses(src.Info).Count > 0) + throw new InvalidOperationException("Stop the game before duplicating its install."); + + var name = $"{src.Info.Name} copy"; + for (var n = 2; cfg.Installs.Any(i => i.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); n++) + name = $"{src.Info.Name} copy {n}"; + + var info = new InstallInfo + { + Name = name, + Branch = src.Info.Branch, + BranchPassword = src.Info.BranchPassword, + LaunchArgs = src.Info.LaunchArgs, + LaunchMode = src.Info.LaunchMode, + AccountId = src.Info.AccountId, + HookIds = src.Info.HookIds.ToList(), + Mods = src.Info.Mods.Select(a => new ModAssignment { ModId = a.ModId, Version = a.Version, Enabled = a.Enabled }).ToList(), + Deployed = src.Info.Deployed.ToDictionary(kv => kv.Key, kv => kv.Value.ToList()), + }; + info.Folder = InstallFolders.UniqueFolder(cfg.Installs, info, name); + + var skip = new[] + { + Path.GetFullPath(Paths.CacheDir(src.Info)), + Path.GetFullPath(Path.Combine(srcGame, "MelonLoader", "Logs")), + Path.GetFullPath(Path.Combine(srcGame, "MelonLoader", "Latest.log")), + }; + Log($"Copying {src.Info.Name} to {name} (cache and logs are not copied; the cache is shared)..."); + try + { + await Task.Run(() => FileOps.CopyTree(srcGame, Paths.GameDir(info), + p => skip.Contains(Path.GetFullPath(p), StringComparer.OrdinalIgnoreCase), Log, ct), ct); + await CacheService.LinkAsync(info, Log, ct); + } + catch + { + await Task.Run(() => FileOps.DeleteDirectorySafe(Paths.InstallDir(info))); + throw; + } + + cfg.Installs.Add(info); + var vm = new InstallVM(this, info); + Installs.Add(vm); + SelectedInstall = vm; + Raise(nameof(CanChangeRoot)); + Log($"Created {name}."); + }); + + public async Task DeleteInstallAsync(InstallVM vm) + { + if (Confirm != null && !await Confirm($"Delete install '{vm.Info.Name}' and all its game files?\nThe shared cache and downloaded mods are kept.")) return; + await Run($"Deleting {vm.Info.Name}", async ct => + { + await Task.Run(() => + { + CacheService.RemoveLinkIfJunction(Paths.CacheDir(vm.Info)); + FileOps.DeleteDirectorySafe(Paths.InstallDir(vm.Info)); + }, ct); + cfg.Installs.Remove(vm.Info); + Installs.Remove(vm); + SelectedInstall = Installs.FirstOrDefault(); + }); + } + + readonly HashSet launching = new(); + + public async Task LaunchAsync(InstallVM vm, string? modeKey = null) + { + var exe = Paths.GameExe(vm.Info); + if (!File.Exists(exe)) { Status = "Nothing to launch: update this install first."; return; } + if (!launching.Add(vm)) return; + try { await LaunchCoreAsync(vm, exe, modeKey); } + finally { launching.Remove(vm); } + } + + async Task LaunchCoreAsync(InstallVM vm, string exe, string? modeKey) + { + Status = $"Preparing {vm.Info.Name}..."; + if (vm.Pending) await ApplyModsAsync(vm); + + var hookFailures = await HookService.RunEventAsync(cfg.Hooks, vm.Info, HookDef.BeforeLaunchEvent, vm.InstalledBuild, Log, CancellationToken.None); + if (hookFailures.Count > 0) Log($"Launching anyway; hook problems: {string.Join(", ", hookFailures)}"); + + var steamOk = await SteamIntegration.EnsureRunningAsync(Log); + if (!steamOk) Log("WARNING: the Steam client is not running, so Steam will not count this session."); + + var gameDir = Paths.GameDir(vm.Info); + await Task.Run(() => + { + try { MultiInstance.Prepare(gameDir, Log); } + catch (Exception e) when (e is IOException or UnauthorizedAccessException) { Log($"Could not prepare the install for several instances: {e.Message}"); } + + var appIdFile = Path.Combine(gameDir, "steam_appid.txt"); + if (!File.Exists(appIdFile)) File.WriteAllText(appIdFile, Paths.AppId.ToString()); + + try + { + if (cfg.CacheGuard) CacheGuardService.Deploy(gameDir, Log); + else CacheGuardService.Remove(gameDir, Log); + } + catch (Exception e) { Log($"Cache guard step failed: {e.Message}"); } + }); + + var psi = new ProcessStartInfo(exe) + { + WorkingDirectory = Paths.GameDir(vm.Info), + UseShellExecute = false, + }; + psi.Environment["SteamAppId"] = Paths.AppId.ToString(); + psi.Environment["SteamGameId"] = Paths.AppId.ToString(); + var mode = LaunchModeOption.Find(modeKey ?? vm.Info.LaunchMode); + var extra = SplitArgs(mode.Arguments).Concat(SplitArgs(vm.Info.LaunchArgs)).ToList(); + var account = cfg.Accounts.FirstOrDefault(a => a.Id == vm.Info.AccountId); + if (account != null) + { + try { extra.Add("--profile=" + await Task.Run(() => AccountService.WriteProfile(gameDir, account))); } + catch (Exception e) when (e is IOException or UnauthorizedAccessException or InvalidOperationException) { Log($"ERROR: {e.Message}"); Status = e.Message; return; } + } + foreach (var arg in extra) psi.ArgumentList.Add(arg); + + Process proc; + try { proc = await Task.Run(() => Process.Start(psi)!); } + catch (Exception e) { Log($"ERROR: could not start the game: {e.Message}"); return; } + + var instanceNo = vm.InstanceCount + 1; + Status = instanceNo > 1 ? $"Launched another instance of {vm.Info.Name} ({instanceNo} running)" : $"Launched {vm.Info.Name}"; + Log($"Launched {vm.Info.Name}, launch mode: {mode.Label}{(account != null ? $", account: {account.Name}" : "")} (pid {proc.Id}, instance {instanceNo})."); + _ = Task.Run(() => GameWindow.ApplyIconWhenReadyAsync(proc, exe)); + Watch(vm, proc, checkSteam: true); + } + + readonly HashSet trackedPids = new(); + + void Watch(InstallVM vm, Process proc, bool checkSteam) + { + var pid = proc.Id; + trackedPids.Add(pid); + vm.InstanceStarted(); + var wasRunning = SteamIntegration.IsAppRunning; + _ = Task.Run(async () => + { + if (checkSteam) + { + for (var i = 0; i < 40 && !proc.HasExited && !SteamIntegration.IsAppRunning; i++) await Task.Delay(1000); + if (proc.HasExited) { } + else if (SteamIntegration.IsAppRunning) + Log(wasRunning ? "Steam already showed ChilloutVR as running before this launch." : "Steam registered the session as ChilloutVR; playtime is being counted."); + else + Log("Steam has not registered the game as running; playtime may not be counted."); + } + await proc.WaitForExitAsync(); + Dispatcher.UIThread.Post(() => + { + trackedPids.Remove(pid); + vm.InstanceEnded(); + Log($"{vm.Info.Name} exited (pid {pid})."); + if (vm.InstanceCount == 0 && renamePending.Remove(vm)) TryRenameFolder(vm); + vm.Refresh(); + }); + }); + } + + static List FindGameProcesses(InstallInfo info) + { + var exe = Path.GetFullPath(Paths.GameExe(info)); + var found = new List(); + foreach (var p in Process.GetProcessesByName("ChilloutVR")) + { + try + { + if (string.Equals(p.MainModule?.FileName, exe, StringComparison.OrdinalIgnoreCase)) { found.Add(p); continue; } + } + catch (Exception e) when (e is System.ComponentModel.Win32Exception or InvalidOperationException) { } + p.Dispose(); + } + return found; + } + + readonly Dictionary renameTimers = new(); + readonly HashSet renamePending = new(); + + bool TryRenameFolder(InstallVM vm) + { + var info = vm.Info; + var desired = InstallFolders.UniqueFolder(cfg.Installs, info, info.Name); + if (desired.Equals(info.Folder, StringComparison.Ordinal)) return true; + + if (vm.IsRunning || FindGameProcesses(info).Count > 0) + { + renamePending.Add(vm); + return false; + } + var before = info.Folder; + try + { + InstallFolders.Rename(info, desired); + info.Folder = desired; + Save(); + vm.Refresh(); + Log($"Renamed the install folder '{before}' to '{desired}'."); + return true; + } + catch (Exception e) when (e is IOException or UnauthorizedAccessException) + { + Log($"Could not rename the folder of '{info.Name}' ({e.Message})."); + return false; + } + } + + public void ScheduleFolderRename(InstallVM vm) + { + if (renameTimers.TryGetValue(vm, out var previous)) previous.Cancel(); + var cts = renameTimers[vm] = new CancellationTokenSource(); + var token = cts.Token; + _ = Task.Run(async () => + { + try + { + await Task.Delay(1200, token); + while (IsBusy) await Task.Delay(1000, token); + } + catch (OperationCanceledException) { return; } + Dispatcher.UIThread.Post(() => + { + if (token.IsCancellationRequested) return; + renameTimers.Remove(vm); + if (!TryRenameFolder(vm) && vm.IsRunning) + Status = $"The folder will be renamed after {vm.Info.Name} is closed."; + }); + }); + } + + void AdoptRunningGames() + { + foreach (var vm in Installs) + { + foreach (var p in FindGameProcesses(vm.Info)) + { + if (trackedPids.Contains(p.Id)) { p.Dispose(); continue; } + Log($"{vm.Info.Name} is already running (pid {p.Id}); adopted it."); + var adopted = p; + _ = Task.Run(() => GameWindow.ApplyIconWhenReadyAsync(adopted, Paths.GameExe(vm.Info))); + Watch(vm, p, checkSteam: false); + } + } + } + + public async Task StopAsync(InstallVM vm) + { + var targets = FindGameProcesses(vm.Info); + if (targets.Count == 0) + { + vm.ResetInstances(); + Status = $"{vm.Info.Name} is not running."; + return; + } + Log($"Stopping {vm.Info.Name} ({targets.Count} instance{(targets.Count == 1 ? "" : "s")})..."); + Status = $"Stopping {vm.Info.Name}..."; + foreach (var p in targets) + { + try { p.CloseMainWindow(); } catch (InvalidOperationException) { } + } + var deadline = DateTime.UtcNow.AddSeconds(8); + while (DateTime.UtcNow < deadline && targets.Any(p => !p.HasExited)) await Task.Delay(250); + foreach (var p in targets.Where(p => !p.HasExited)) + { + Log($"{vm.Info.Name} did not close in time; ending the process."); + try { p.Kill(true); } catch (Exception e) when (e is InvalidOperationException or System.ComponentModel.Win32Exception) { } + } + foreach (var p in targets) p.Dispose(); + } + + static IEnumerable SplitArgs(string s) + { + var sb = new StringBuilder(); + var quoted = false; + foreach (var c in s) + { + if (c == '"') quoted = !quoted; + else if (char.IsWhiteSpace(c) && !quoted) + { + if (sb.Length > 0) { yield return sb.ToString(); sb.Clear(); } + } + else sb.Append(c); + } + if (sb.Length > 0) yield return sb.ToString(); + } + + public Task ApplyModsAsync(InstallVM vm) => Run($"Applying mods to {vm.Info.Name}", async ct => + { + await store.ApplyAsync(vm.Info, cfg.Mods, Log, ct); + vm.ClearPending(); + }); + + public Task ToggleMelonLoaderAsync(InstallVM vm) + { + var game = Paths.GameDir(vm.Info); + var dll = Path.Combine(game, "version.dll"); + var off = dll + ".off"; + var a = vm.MlAssignment; + + if (vm.MlPresent) + { + if (a != null) { a.Enabled = false; return ApplyModsAsync(vm); } + return Run("Disabling MelonLoader", _ => { File.Move(dll, off, true); return Task.CompletedTask; }); + } + if (a != null) { a.Enabled = true; return ApplyModsAsync(vm); } + if (vm.MlOffPresent) return Run("Enabling MelonLoader", _ => { File.Move(off, dll, true); return Task.CompletedTask; }); + return SetMelonLoaderVersionAsync(vm); + } + + public Task SetMelonLoaderVersionAsync(InstallVM vm) + { + var tag = vm.MlVersionChoice; + if (tag == null) { Status = "Pick a MelonLoader version first (the app never guesses one)."; return Task.CompletedTask; } + var a = vm.MlAssignment; + if (a == null) vm.Info.Mods.Add(a = new ModAssignment { ModId = ModDef.MelonLoaderId }); + a.Version = tag; + a.Enabled = true; + return Run("Installing MelonLoader", async ct => + { + if (MelonLoader.Releases.Count == 0) await RefreshModCoreAsync(MelonLoader, true, ct); + await store.ApplyAsync(vm.Info, cfg.Mods, Log, ct); + vm.ClearPending(); + }); + } + + async Task RefreshModCoreAsync(ModDef mod, bool quiet = false, CancellationToken ct = default) + { + if (mod.Source == "local" || mod.Local) return; + try + { + if (mod.Source == "cvrmg") + { + var all = await cvrmg.GetAllAsync(ct); + var m = all.FirstOrDefault(x => x.Id == mod.CvrmgId) ?? throw new InvalidOperationException("no longer listed on CVRMG"); + CvrmgService.ApplyMeta(mod, m); + mod.SetReleases(new List { CvrmgService.ToRelease(m, mod.FileName.Length > 0 ? mod.FileName : Paths.Safe(m.Name) + ".dll") }); + } + else + { + var fresh = await github.GetReleasesAsync(mod.Repo, ct); + var filtered = ModImportService.FilterReleases(fresh, mod.AssetFilter).ToList(); + if (mod.Id == ModDef.MelonLoaderId) + { + try + { + if (await github.GetMelonLoaderNightlyAsync(ct) is { } nightly) filtered.Insert(0, nightly); + } + catch (Exception e) when (e is not OperationCanceledException) { Log($"MelonLoader nightly: could not look up ({e.Message})"); } + } + mod.SetReleases(filtered); + } + if (!quiet) Log($"{mod.Name}: {mod.Releases.Count} versions, latest {mod.LatestTag}"); + } + catch (Exception e) when (quiet && e is not OperationCanceledException) + { + Log($"{mod.Name}: could not fetch versions ({e.Message})"); + } + Dispatcher.UIThread.Post(() => + { + Mods.FirstOrDefault(m => m.Info == mod)?.Rebuild(); + foreach (var i in Installs) i.Refresh(); + RegroupMods(); + Save(); + }); + } + + public async Task SwitchSourceAsync(ModVM vm, string source) + { + var def = vm.Info; + if (def.Source == source) return; + var previous = def.Source; + def.Source = source; + def.Releases = def.Releases.Where(r => r.Snapshot).ToList(); + try + { + if (source == "cvrmg") + { + var m = (await cvrmg.GetAllAsync(CancellationToken.None)).FirstOrDefault(x => x.Id == def.CvrmgId) + ?? throw new InvalidOperationException("this mod is not listed on CVRMG"); + if (def.FileName.Length == 0) def.FileName = Paths.Safe(def.Name) + ".dll"; + CvrmgService.ApplyMeta(def, m); + def.SetReleases(new List { CvrmgService.ToRelease(m, def.FileName) }); + } + else + { + var releases = await importer.ReleasesAsync(def.Repo, Log, CancellationToken.None); + def.SetReleases(ModImportService.FilterReleases(releases, def.AssetFilter)); + } + } + catch (Exception e) + { + Log($"{def.Name}: could not switch to {source} ({e.Message})"); + def.Source = previous; + } + + foreach (var inst in Installs) + if (inst.Info.Mods.FirstOrDefault(a => a.ModId == def.Id) is { } a && a.Version != "latest" && def.Releases.All(r => r.Tag != a.Version)) + a.Version = "latest"; + + vm.Rebuild(); + if (cfg.Mods.Contains(def)) Save(); + } + + public Task RefreshModAsync(ModVM vm) => Run($"Refreshing {vm.Info.Name}", ct => RefreshModCoreAsync(vm.Info, ct: ct)); + + Task RefreshAllModsAsync() => Run("Refreshing mod sources", ct => RefreshAvailableAsync(true, ct)); + + async Task AddModAsync() + { + var repo = GitHubService.ParseRepo(AddModRepo); + if (repo == null) { Status = "Enter a GitHub repo as owner/repo or a github.com URL."; return; } + if (cfg.Mods.Any(m => m.Repo.Equals(repo, StringComparison.OrdinalIgnoreCase))) { Status = "That repo is already in the catalog."; return; } + var def = new ModDef { Name = repo.Split('/')[1], Repo = repo }; + await Run($"Adding {repo}", async ct => + { + await RefreshModCoreAsync(def, ct: ct); + cfg.Mods.Add(def); + var vm = new ModVM(this, def); + Mods.Add(vm); + SelectedMod = vm; + AddModRepo = ""; + }); + } + + void SyncModList() + { + foreach (var def in cfg.Mods.Where(d => Mods.All(v => v.Info != d)).ToList()) Mods.Add(new ModVM(this, def)); + foreach (var m in Mods) m.Rebuild(); + _ = RefreshAvailableAsync(false); + } + + async Task ImportModsCoreAsync(InstallInfo info, CancellationToken ct) + { + var found = await importer.IdentifyAsync(Paths.GameDir(info), cfg.Sources, Log, ct); + var added = await Task.Run(() => importer.Apply(cfg, info, found, Log), ct); + int Count(string k) => found.Count(f => f.Source == k); + Log($"Imported {added} mods: {Count("github")} from GitHub repos, {Count("cvrmg")} from CVRMG, {Count("local")} kept as local snapshots."); + SyncModList(); + } + + public Task ImportInstallModsAsync(InstallVM vm) => Run($"Importing mods from {vm.Info.Name}", async ct => + { + await ImportModsCoreAsync(vm.Info, ct); + vm.Rebuild(); + vm.ClearPending(); + }); + + public ObservableCollection Sources { get; } = new(); + string addSourceRepo = ""; + public string AddSourceRepo { get => addSourceRepo; set => Set(ref addSourceRepo, value); } + + public ICommand ScanSteamInstallCommand => new RelayCommand(() => Run("Scanning your Steam install's mods", async ct => + { + var dir = DetectedInstalls.FirstOrDefault() ?? throw new InvalidOperationException("No Steam install of ChilloutVR was found."); + var found = await importer.IdentifyAsync(dir, cfg.Sources, Log, ct); + var added = await Task.Run(() => importer.Apply(cfg, null, found, Log, dir), ct); + int Count(string k) => found.Count(f => f.Source == k); + Log($"Catalog updated from {dir}: {added} mods ({Count("github")} from GitHub repos, {Count("cvrmg")} from CVRMG, {Count("local")} local snapshots)."); + SyncModList(); + })); + + public ICommand AddSourceCommand => new RelayCommand(() => + { + var repo = GitHubService.ParseRepo(AddSourceRepo); + if (repo == null) { Status = "Enter a GitHub repo as owner/repo or a github.com URL."; return; } + if (cfg.Sources.Any(s => s.Repo.Equals(repo, StringComparison.OrdinalIgnoreCase))) { Status = "That source is already listed."; return; } + var def = new SourceDef { Name = repo.Split('/')[1], Kind = "github", Repo = repo }; + cfg.Sources.Add(def); + var sv = new SourceVM(this, def); + Sources.Add(sv); + SelectedSource = sv; + AddSourceRepo = ""; + Save(); + _ = RefreshAvailableAsync(false); + }); + + public void RemoveSource(SourceVM vm) + { + if (!vm.CanRemove) return; + cfg.Sources.Remove(vm.Info); + Sources.Remove(vm); + if (SelectedSource == vm) SelectedSource = Sources.FirstOrDefault(); + Save(); + _ = RefreshAvailableAsync(false); + } + + SourceVM? selectedSource; + public SourceVM? SelectedSource { get => selectedSource; set { if (Set(ref selectedSource, value)) Raise(nameof(HasSelectedSource)); } } + public bool HasSelectedSource => selectedSource != null; + + public async Task AddLocalFilesAsync(ModVM? vm = null) + { + if (PickFiles == null) return; + var files = await PickFiles(); + if (files.Count == 0) return; + await Run("Importing local mod", ct => + { + var def = vm?.Info; + if (def == null) + { + def = new ModDef { Name = Path.GetFileNameWithoutExtension(files[0]), Local = true }; + def.Releases.Add(new ReleaseInfo { Tag = "local", Published = DateTime.Now }); + cfg.Mods.Add(def); + var nv = new ModVM(this, def); + Mods.Add(nv); + SelectedMod = nv; + } + store.ImportLocal(def, files); + return Task.CompletedTask; + }); + } + + public Task AddLocalFilesNewAsync() => AddLocalFilesAsync(); + + public Task DownloadModAsync(ModVM vm) => Run($"Downloading {vm.Info.Name}", async ct => + { + var tag = vm.SelectedRelease?.Tag ?? vm.Info.LatestTag; + if (tag == null) throw new InvalidOperationException("No version selected; refresh versions first."); + await store.EnsureDownloadedAsync(vm.Info, tag, Log, ct); + }); + + public async Task DeleteModDownloadAsync(ModVM vm) + { + var tag = vm.SelectedRelease?.Tag; + if (tag == null) return; + await Run($"Deleting {vm.Info.Name} {tag}", _ => { ModStore.DeleteVersion(vm.Info, tag); return Task.CompletedTask; }); + } + + public async Task RemoveModAsync(ModVM vm) + { + if (vm.IsBuiltin) return; + var users = Installs.Where(i => i.Info.Mods.Any(a => a.ModId == vm.Info.Id)).ToList(); + if (Confirm != null && !await Confirm(users.Count == 0 + ? $"Remove {vm.Info.Name} from the catalog and delete its downloads?" + : $"Remove {vm.Info.Name}? It is assigned to: {string.Join(", ", users.Select(u => u.Info.Name))}. Its files stay in those installs until you apply mods there.")) return; + await Run($"Removing {vm.Info.Name}", ct => + { + foreach (var u in users) + { + u.Info.Mods.RemoveAll(a => a.ModId == vm.Info.Id); + u.Rebuild(); + u.MarkPending(); + } + cfg.Mods.Remove(vm.Info); + Mods.Remove(vm); + SelectedMod = Mods.FirstOrDefault(); + _ = RefreshAvailableAsync(false); + var dir = Path.Combine(Paths.ModStore, vm.Info.Id); + if (Directory.Exists(dir)) Directory.Delete(dir, true); + return Task.CompletedTask; + }); + } + + async Task BrowseLibraryRootAsync() + { + if (PickFolder == null) return; + var p = await PickFolder(); + if (p != null) LibraryRoot = p; + } + + async Task BrowseImportAsync() + { + if (PickFolder == null) return; + var p = await PickFolder(); + if (p != null) NewImportPath = p; + } + + void ApplyLibraryRoot() + { + if (!CanChangeRoot) { Status = "Delete all installs before changing the library location."; return; } + Paths.Root = cfg.LibraryRoot; + Save(); + Directory.CreateDirectory(Paths.Root); + Status = $"Library location set to {Paths.Root}"; + } +} diff --git a/Views/LogView.cs b/Views/LogView.cs new file mode 100644 index 0000000..51f5154 --- /dev/null +++ b/Views/LogView.cs @@ -0,0 +1,453 @@ +using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Input; +using Avalonia.Input.Platform; +using Avalonia.Media; +using Avalonia.Threading; + +namespace CVRManager.Views; + +public class LogView : UserControl +{ + public static readonly StyledProperty TextProperty = AvaloniaProperty.Register(nameof(Text)); + + readonly ScrollViewer scroll; + readonly LogSurface surface = new(); + + static LogView() => TextProperty.Changed.AddClassHandler((c, _) => c.OnTextChanged()); + + public LogView() + { + scroll = new ScrollViewer + { + Content = surface, + HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + }; + scroll.ScrollChanged += (_, _) => surface.UpdateView(scroll.Offset, scroll.Viewport); + Content = new Border + { + Background = new SolidColorBrush(Color.Parse("#0B0D10")), + BorderBrush = new SolidColorBrush(Color.Parse("#232833")), + BorderThickness = new Thickness(1), + CornerRadius = new CornerRadius(8), + ClipToBounds = true, + Child = scroll, + }; + } + + public string? Text + { + get => GetValue(TextProperty); + set => SetValue(TextProperty, value); + } + + void OnTextChanged() + { + var atEnd = scroll.Extent.Height <= 0 || scroll.Offset.Y + scroll.Viewport.Height >= scroll.Extent.Height - 24; + if (!surface.SetText(Text ?? "")) return; + if (atEnd) Dispatcher.UIThread.Post(() => scroll.ScrollToEnd(), DispatcherPriority.Background); + } +} + +internal sealed class LogSurface : Control +{ + const int MaxLines = 20000; + const int KeepLines = 15000; + + static readonly IBrush DefaultBrush = new SolidColorBrush(Color.Parse("#E6E8EC")); + static readonly IBrush TimeBrush = new SolidColorBrush(Color.Parse("#6B7585")); + static readonly IBrush TagBrush = new SolidColorBrush(Color.Parse("#7AA2FF")); + static readonly IBrush ErrorBrush = new SolidColorBrush(Color.Parse("#F0646A")); + static readonly IBrush WarnBrush = new SolidColorBrush(Color.Parse("#F5B13D")); + static readonly IBrush SelectionBrush = new SolidColorBrush(Color.Parse("#553A5BA8")); + + static readonly Regex TimeRx = new(@"^(\[\d{1,2}:\d{2}:\d{2}(?:[.,]\d+)?\]|\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:[.,]\d+)?)(\s*)(.*)$", RegexOptions.Compiled); + static readonly Regex TagRx = new(@"^(\s*(?:\[[^\]]{1,40}\]|\([^)]{1,100}\)))(.*)$", RegexOptions.Compiled); + static readonly Regex StackRx = new(@"^\s+at\s", RegexOptions.Compiled); + static readonly Regex FileLineRx = new(@"^\(Filename:", RegexOptions.Compiled); + static readonly Regex PipeLevelRx = new(@"\|\s*(?error|exception|fatal|warn|warning|info|debug|trace)\s*\)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + static readonly Regex BracketLevelRx = new(@"\[(?error|fatal|fail|exception|warn|warning)\]", RegexOptions.Compiled | RegexOptions.IgnoreCase); + static readonly Regex LeadingLevelRx = new(@"^\s*(?error|fatal|unhandled exception|exception|failed|failure|warning|warn)\b", RegexOptions.Compiled | RegexOptions.IgnoreCase); + static readonly Regex ExceptionRx = new(@"(?:^|\s)(?:[A-Za-z_]\w*\.)*[A-Za-z_]\w*Exception:", RegexOptions.Compiled); + + readonly record struct Seg(string Text, IBrush Brush); + + static readonly Regex AnsiRx = new("\u001b\\[([0-9;]*)m", RegexOptions.Compiled); + static readonly Regex OtherEscRx = new("\u001b\\[[0-9;?]*[A-Za-ln-z]", RegexOptions.Compiled); + static readonly IBrush[] AnsiNormal = new[] { "#8B93A1", "#F0646A", "#4ADE9B", "#F5B13D", "#7AA2FF", "#C792EA", "#5FD3E0", "#E6E8EC" } + .Select(c => (IBrush)new SolidColorBrush(Color.Parse(c))).ToArray(); + static readonly IBrush[] AnsiBright = new[] { "#A0A8B5", "#FF8087", "#6EF0B5", "#FFD166", "#9AB8FF", "#DDA8FF", "#8FEAF5", "#FFFFFF" } + .Select(c => (IBrush)new SolidColorBrush(Color.Parse(c))).ToArray(); + + static IBrush Rgb(int r, int g, int b) => new SolidColorBrush(Color.FromRgb((byte)Math.Clamp(r, 0, 255), (byte)Math.Clamp(g, 0, 255), (byte)Math.Clamp(b, 0, 255))); + + static IBrush? ApplySgr(string codes, IBrush? current) + { + var parts = codes.Length == 0 ? new[] { "0" } : codes.Split(';'); + for (var i = 0; i < parts.Length; i++) + { + if (!int.TryParse(parts[i], out var n)) continue; + if (n == 0 || n == 39) current = null; + else if (n >= 30 && n <= 37) current = AnsiNormal[n - 30]; + else if (n >= 90 && n <= 97) current = AnsiBright[n - 90]; + else if (n == 38 && i + 1 < parts.Length) + { + if (parts[i + 1] == "2" && i + 4 < parts.Length && int.TryParse(parts[i + 2], out var r) && int.TryParse(parts[i + 3], out var g) && int.TryParse(parts[i + 4], out var b)) + { + current = Rgb(r, g, b); + i += 4; + } + else if (parts[i + 1] == "5" && i + 2 < parts.Length && int.TryParse(parts[i + 2], out var idx)) + { + if (idx < 8) current = AnsiNormal[idx]; + else if (idx < 16) current = AnsiBright[idx - 8]; + else if (idx < 232) + { + var c = idx - 16; + int Level(int v) => v == 0 ? 0 : 55 + v * 40; + current = Rgb(Level(c / 36), Level(c / 6 % 6), Level(c % 6)); + } + else { var v = 8 + (idx - 232) * 10; current = Rgb(v, v, v); } + i += 2; + } + } + } + return current; + } + + static Line ParseAnsi(string raw, IBrush? carried) + { + raw = OtherEscRx.Replace(raw, ""); + var segs = new List(4); + var brush = carried; + var pos = 0; + foreach (Match m in AnsiRx.Matches(raw)) + { + if (m.Index > pos) segs.Add(new Seg(raw[pos..m.Index], brush ?? DefaultBrush)); + brush = ApplySgr(m.Groups[1].Value, brush); + pos = m.Index + m.Length; + } + if (pos < raw.Length) segs.Add(new Seg(raw[pos..], brush ?? DefaultBrush)); + return new Line { Text = string.Concat(segs.Select(s => s.Text)), Segs = segs.ToArray(), AnsiEnd = brush }; + } + + sealed class Line + { + public IBrush? AnsiEnd; + public string Text = ""; + public Seg[] Segs = Array.Empty(); + public IBrush? Level; + } + + readonly List lines = new(); + readonly Dictionary formatted = new(); + readonly Typeface typeface = new(new FontFamily("Cascadia Mono,Consolas,monospace")); + readonly double fontSize = 12; + readonly Thickness pad = new(12, 8); + readonly double charWidth; + readonly double lineHeight; + + string shown = ""; + int maxCols; + Vector offset; + Size viewport; + (int Line, int Col)? anchor; + (int Line, int Col)? caret; + bool dragging; + + public LogSurface() + { + var probe = Format("0000000000", DefaultBrush); + charWidth = probe.Width / 10; + lineHeight = Math.Ceiling(probe.Height) + 1; + Focusable = true; + Cursor = new Cursor(StandardCursorType.Ibeam); + ClipToBounds = true; + } + + FormattedText Format(string text, IBrush brush) => + new(text, CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeface, fontSize, brush); + + static IBrush? FromWord(string word) => word.ToLowerInvariant() switch + { + "error" or "fatal" or "fail" or "exception" or "failed" or "failure" or "unhandled exception" => ErrorBrush, + "warn" or "warning" => WarnBrush, + _ => null, + }; + + static IBrush? LevelOfLine(string line) + { + var pipe = PipeLevelRx.Match(line); + if (pipe.Success) return FromWord(pipe.Groups["l"].Value); + + var head = line.Length > 160 ? line[..160] : line; + var bracket = BracketLevelRx.Match(head); + if (bracket.Success) return FromWord(bracket.Groups["l"].Value); + + var message = line; + var time = TimeRx.Match(message); + if (time.Success) message = time.Groups[3].Value; + var tag = TagRx.Match(message); + while (tag.Success) + { + message = tag.Groups[2].Value; + tag = TagRx.Match(message); + } + + var leading = LeadingLevelRx.Match(message); + if (leading.Success) return FromWord(leading.Groups["l"].Value); + return ExceptionRx.IsMatch(message) ? ErrorBrush : null; + } + + static Line Parse(string text, IBrush? inherited) + { + var line = new Line { Text = text, Level = inherited }; + var segs = new List(4); + if (StackRx.IsMatch(text)) segs.Add(new Seg(text, inherited ?? DefaultBrush)); + else if (FileLineRx.IsMatch(text)) segs.Add(new Seg(text, TimeBrush)); + else + { + var level = LevelOfLine(text); + line.Level = level; + var rest = text; + var time = TimeRx.Match(rest); + if (time.Success) + { + segs.Add(new Seg(time.Groups[1].Value, TimeBrush)); + if (time.Groups[2].Length > 0) segs.Add(new Seg(time.Groups[2].Value, DefaultBrush)); + rest = time.Groups[3].Value; + } + var tag = TagRx.Match(rest); + if (tag.Success) + { + segs.Add(new Seg(tag.Groups[1].Value, level ?? TagBrush)); + rest = tag.Groups[2].Value; + } + if (rest.Length > 0) segs.Add(new Seg(rest, level ?? DefaultBrush)); + } + line.Segs = segs.ToArray(); + return line; + } + + void AppendLines(string chunk) + { + var parts = chunk.Split('\n'); + var count = parts.Length; + if (count > 0 && parts[^1].Length == 0) count--; + for (var i = 0; i < count; i++) + { + var text = parts[i].TrimEnd('\r'); + var carried = lines.Count > 0 ? lines[^1].AnsiEnd : null; + var line = carried != null || text.IndexOf('\u001b') >= 0 + ? ParseAnsi(text, carried) + : Parse(text, lines.Count > 0 ? lines[^1].Level : null); + text = line.Text; + lines.Add(line); + if (text.Length > maxCols) maxCols = text.Length; + } + } + + void TrimHead() + { + if (lines.Count <= MaxLines) return; + var drop = lines.Count - KeepLines; + foreach (var l in lines.Take(drop)) formatted.Remove(l); + lines.RemoveRange(0, drop); + maxCols = lines.Count == 0 ? 0 : lines.Max(l => l.Text.Length); + anchor = anchor is { } a ? (Math.Max(0, a.Line - drop), a.Line - drop < 0 ? 0 : a.Col) : null; + caret = caret is { } c ? (Math.Max(0, c.Line - drop), c.Line - drop < 0 ? 0 : c.Col) : null; + } + + public bool SetText(string text) + { + if (text == shown) return false; + + string? appended = null; + var endsWithNewline = shown.Length == 0 || shown[^1] == '\n'; + if (shown.Length > 0 && text.StartsWith(shown, StringComparison.Ordinal)) appended = text[shown.Length..]; + else if (shown.Length > 0) + { + var key = shown.Length > 400 ? shown[^400..] : shown; + var at = text.LastIndexOf(key, StringComparison.Ordinal); + if (at >= 0) appended = text[(at + key.Length)..]; + } + + if (appended == null) + { + lines.Clear(); + formatted.Clear(); + maxCols = 0; + anchor = caret = null; + AppendLines(text); + } + else + { + var partial = ""; + if (!endsWithNewline && lines.Count > 0) + { + partial = lines[^1].Text; + formatted.Remove(lines[^1]); + lines.RemoveAt(lines.Count - 1); + } + AppendLines(partial + appended); + } + + TrimHead(); + shown = text; + InvalidateMeasure(); + InvalidateVisual(); + return true; + } + + public void UpdateView(Vector newOffset, Size newViewport) + { + var resized = newViewport != viewport; + offset = newOffset; + viewport = newViewport; + if (resized) InvalidateMeasure(); + InvalidateVisual(); + } + + protected override Size MeasureOverride(Size availableSize) + { + var width = pad.Left + pad.Right + maxCols * charWidth; + var height = pad.Top + pad.Bottom + lines.Count * lineHeight; + return new Size(Math.Max(width, viewport.Width), Math.Max(height, viewport.Height)); + } + + public override void Render(DrawingContext context) + { + context.FillRectangle(Brushes.Transparent, new Rect(Bounds.Size)); + if (lines.Count == 0) return; + + var first = Math.Max(0, (int)((offset.Y - pad.Top) / lineHeight)); + var last = Math.Min(lines.Count - 1, (int)((offset.Y + viewport.Height - pad.Top) / lineHeight) + 1); + var (selStart, selEnd) = Selection(); + + if (formatted.Count > 600) formatted.Clear(); + for (var i = first; i <= last; i++) + { + var line = lines[i]; + var y = pad.Top + i * lineHeight; + + if (selStart is { } s && selEnd is { } e && i >= s.Line && i <= e.Line) + { + var c0 = i == s.Line ? s.Col : 0; + var c1 = i == e.Line ? e.Col : line.Text.Length + 1; + if (c1 > c0) context.FillRectangle(SelectionBrush, new Rect(pad.Left + c0 * charWidth, y, (c1 - c0) * charWidth, lineHeight)); + } + + if (!formatted.TryGetValue(line, out var fts)) + formatted[line] = fts = line.Segs.Select(sg => Format(sg.Text, sg.Brush)).ToArray(); + + var x = pad.Left; + for (var k = 0; k < line.Segs.Length; k++) + { + var width = line.Segs[k].Text.Length * charWidth; + if (x + width >= offset.X && x <= offset.X + viewport.Width) + context.DrawText(fts[k], new Point(x, y)); + x += width; + } + } + } + + (int Line, int Col) HitTest(Point p) + { + if (lines.Count == 0) return (0, 0); + var line = Math.Clamp((int)Math.Floor((p.Y - pad.Top) / lineHeight), 0, lines.Count - 1); + var col = Math.Clamp((int)Math.Round((p.X - pad.Left) / charWidth), 0, lines[line].Text.Length); + return (line, col); + } + + ((int Line, int Col)? Start, (int Line, int Col)? End) Selection() + { + if (anchor is not { } a || caret is not { } c || a == c) return (null, null); + var forward = a.Line < c.Line || (a.Line == c.Line && a.Col <= c.Col); + return forward ? (a, c) : (c, a); + } + + protected override void OnPointerPressed(PointerPressedEventArgs e) + { + base.OnPointerPressed(e); + Focus(); + if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) return; + var hit = HitTest(e.GetPosition(this)); + if (e.ClickCount == 2 && lines.Count > 0) + { + var text = lines[hit.Line].Text; + int start = hit.Col, end = hit.Col; + while (start > 0 && !char.IsWhiteSpace(text[start - 1])) start--; + while (end < text.Length && !char.IsWhiteSpace(text[end])) end++; + anchor = (hit.Line, start); + caret = (hit.Line, end); + } + else if (e.ClickCount >= 3 && lines.Count > 0) + { + anchor = (hit.Line, 0); + caret = (hit.Line, lines[hit.Line].Text.Length); + } + else + { + anchor = hit; + caret = hit; + dragging = true; + } + e.Pointer.Capture(this); + InvalidateVisual(); + } + + protected override void OnPointerMoved(PointerEventArgs e) + { + base.OnPointerMoved(e); + if (!dragging) return; + caret = HitTest(e.GetPosition(this)); + InvalidateVisual(); + } + + protected override void OnPointerReleased(PointerReleasedEventArgs e) + { + base.OnPointerReleased(e); + dragging = false; + e.Pointer.Capture(null); + } + + string SelectedText() + { + var (start, end) = Selection(); + if (start is not { } s || end is not { } e) return ""; + var sb = new StringBuilder(); + for (var i = s.Line; i <= e.Line && i < lines.Count; i++) + { + var text = lines[i].Text; + var c0 = i == s.Line ? Math.Min(s.Col, text.Length) : 0; + var c1 = i == e.Line ? Math.Min(e.Col, text.Length) : text.Length; + sb.Append(text, c0, Math.Max(0, c1 - c0)); + if (i < e.Line) sb.Append('\n'); + } + return sb.ToString(); + } + + protected override async void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + if (!e.KeyModifiers.HasFlag(KeyModifiers.Control)) return; + if (e.Key == Key.A && lines.Count > 0) + { + anchor = (0, 0); + caret = (lines.Count - 1, lines[^1].Text.Length); + InvalidateVisual(); + e.Handled = true; + } + else if (e.Key == Key.C) + { + var text = SelectedText(); + if (text.Length > 0 && TopLevel.GetTopLevel(this)?.Clipboard is { } clipboard) await clipboard.SetTextAsync(text); + e.Handled = true; + } + } +} diff --git a/Views/MainWindow.axaml b/Views/MainWindow.axaml new file mode 100644 index 0000000..6927571 --- /dev/null +++ b/Views/MainWindow.axaml @@ -0,0 +1,627 @@ + + + + + + + + + + + + + + + + + + + +