From 37e8e1eaf8ea30a612301304e3ebac745b6ca84c Mon Sep 17 00:00:00 2001 From: LynithDev <61880709+LynithDev@users.noreply.github.com> Date: Fri, 2 May 2025 10:41:55 +0200 Subject: [PATCH] chore: move onelauncher apps into its own folder --- .vscode/settings.json | 10 +- Cargo.toml | 2 +- apps/desktop/src/api/commands/cluster.rs | 217 ---------------- apps/desktop/src/api/commands/package.rs | 234 ------------------ apps/desktop/src/api/commands/processor.rs | 61 ----- apps/desktop/src/api/commands/users.rs | 119 --------- apps/{ => onelauncher}/desktop/.gitignore | 0 .../desktop/App.entitlements | 0 apps/{ => onelauncher}/desktop/Cargo.toml | 0 apps/{ => onelauncher}/desktop/Info.plist | 0 apps/{ => onelauncher}/desktop/build.rs | 0 .../desktop/capabilities/default.json | 0 apps/{ => onelauncher}/desktop/package.json | 2 - .../desktop/src/api/commands.rs | 83 ++++--- .../desktop/src/api/commands/cluster.rs | 217 ++++++++++++++++ .../desktop/src/api/commands/package.rs | 234 ++++++++++++++++++ .../desktop/src/api/commands/processor.rs | 61 +++++ .../desktop/src/api/commands/users.rs | 119 +++++++++ .../desktop/src/api/events.rs | 0 apps/{ => onelauncher}/desktop/src/api/mod.rs | 0 .../desktop/src/api/statics.rs | 0 .../desktop/src/constants.rs | 0 apps/{ => onelauncher}/desktop/src/ext/mod.rs | 0 .../desktop/src/ext/specta.rs | 2 +- .../desktop/src/ext/updater.rs | 0 apps/{ => onelauncher}/desktop/src/lib.rs | 29 ++- apps/{ => onelauncher}/desktop/src/main.rs | 0 .../{ => onelauncher}/desktop/tauri.conf.json | 14 +- .../distribution/aur/cli/PKGBUILD | 0 .../distribution/aur/gui/PKGBUILD | 0 .../distribution/brew/onelauncher.rb | 0 .../flatpak/org.polyfrost.launcher.desktop | 0 .../org.polyfrost.launcher.metainfo.xml | 0 .../flatpak/org.polyfrost.launcher.yml | 0 .../distribution/icons/128x128.png | Bin .../distribution/icons/128x128@2x.png | Bin .../onelauncher}/distribution/icons/32x32.png | Bin .../distribution/icons/512x512.png | Bin .../distribution/icons/Square107x107Logo.png | Bin .../distribution/icons/Square142x142Logo.png | Bin .../distribution/icons/Square150x150Logo.png | Bin .../distribution/icons/Square284x284Logo.png | Bin .../distribution/icons/Square30x30Logo.png | Bin .../distribution/icons/Square310x310Logo.png | Bin .../distribution/icons/Square44x44Logo.png | Bin .../distribution/icons/Square71x71Logo.png | Bin .../distribution/icons/Square89x89Logo.png | Bin .../distribution/icons/StoreLogo.png | Bin .../onelauncher}/distribution/icons/icon.icns | Bin .../onelauncher}/distribution/icons/icon.ico | Bin .../onelauncher}/distribution/icons/icon.png | Bin .../org.polyfrost.launcher.desktop.template | 0 .../distribution/scoop/onelauncher.json | 0 .../Polyfrost.OneLauncher.installer.yaml | 0 .../Polyfrost.OneLauncher.locale.en-US.yaml | 0 .../winget/Polyfrost.OneLauncher.yaml | 0 .../frontend/dist/.gitignore | 0 apps/{ => onelauncher}/frontend/index.html | 0 .../frontend/isolation/index.html | 0 .../frontend/isolation/index.js | 0 apps/{ => onelauncher}/frontend/package.json | 0 .../frontend/src/RootLayout.tsx | 0 .../onboarding/import_from_others.svg | 0 .../illustrations/onboarding/language.svg | 0 .../assets/images/default_instance_cover.jpg | Bin .../src/assets/images/default_world.png | Bin .../frontend/src/assets/images/header.png | Bin .../frontend/src/assets/images/steve.png | Bin .../frontend/src/assets/logos/curseforge.svg | 0 .../frontend/src/assets/logos/discord.svg | 0 .../src/assets/logos/launchers/atlauncher.svg | 0 .../src/assets/logos/launchers/ftb.svg | 0 .../src/assets/logos/launchers/gdlauncher.png | Bin .../src/assets/logos/launchers/multimc.png | Bin .../assets/logos/launchers/prismlauncher.svg | 0 .../src/assets/logos/launchers/technic.png | Bin .../src/assets/logos/launchers/tlauncher.png | Bin .../src/assets/logos/loaders/fabric.png | Bin .../src/assets/logos/loaders/forge.png | Bin .../src/assets/logos/loaders/neoforge.png | Bin .../src/assets/logos/loaders/quilt.png | Bin .../frontend/src/assets/logos/microsoft.svg | 0 .../frontend/src/assets/logos/minecraft.png | Bin .../frontend/src/assets/logos/modrinth.svg | 0 .../frontend/src/assets/logos/oneconfig.svg | 0 .../frontend/src/assets/logos/onelauncher.svg | 0 .../src/assets/logos/onelauncher_full.svg | 0 .../src/assets/logos/onelauncher_text.svg | 0 .../frontend/src/assets/logos/skyclient.png | Bin .../{ => onelauncher}/frontend/src/imports.ts | 0 apps/{ => onelauncher}/frontend/src/index.tsx | 0 .../frontend/src/styles/globals.scss | 0 .../frontend/src/styles/highlightjs.css | 0 .../src/styles/themes/_OneLauncher.scss | 0 .../frontend/src/styles/themes/_helpers.scss | 0 .../frontend/src/styles/themes/index.scss | 0 .../src/ui/components/AnimatedRoutes.tsx | 0 .../src/ui/components/DynamicTime.tsx | 0 .../src/ui/components/ErrorBoundary.tsx | 0 .../src/ui/components/LaunchButton.tsx | 0 .../src/ui/components/MultiProvider.tsx | 0 .../frontend/src/ui/components/Navbar.tsx | 0 .../src/ui/components/ScrollableContainer.tsx | 0 .../src/ui/components/SettingsRow.tsx | 0 .../frontend/src/ui/components/Sidebar.tsx | 0 .../frontend/src/ui/components/Spinner.tsx | 0 .../src/ui/components/WindowFrame.tsx | 0 .../src/ui/components/base/Button.module.scss | 0 .../src/ui/components/base/Button.test.tsx | 0 .../src/ui/components/base/Button.tsx | 0 .../ui/components/base/Checkbox.module.scss | 0 .../src/ui/components/base/Checkbox.tsx | 0 .../ui/components/base/Dropdown.module.scss | 0 .../src/ui/components/base/Dropdown.tsx | 0 .../src/ui/components/base/FilePicker.tsx | 0 .../src/ui/components/base/Link.module.scss | 0 .../frontend/src/ui/components/base/Link.tsx | 0 .../ui/components/base/SelectList.module.scss | 0 .../src/ui/components/base/SelectList.tsx | 0 .../src/ui/components/base/Tag.module.scss | 0 .../frontend/src/ui/components/base/Tag.tsx | 0 .../ui/components/base/TextField.module.scss | 0 .../src/ui/components/base/TextField.tsx | 0 .../src/ui/components/base/Toggle.tsx | 0 .../ui/components/base/Tooltip.module.scss | 0 .../src/ui/components/base/Tooltip.tsx | 0 .../content/FormattedLog.module.scss | 0 .../ui/components/content/FormattedLog.tsx | 0 .../ui/components/content/LauncherIcon.tsx | 0 .../content/LauncherImportComponent.tsx | 0 .../components/content/Markdown.module.scss | 0 .../src/ui/components/content/Markdown.tsx | 0 .../ui/components/content/ProviderIcon.tsx | 0 .../ui/components/content/SearchResults.tsx | 0 .../components/game/ClusterCover.module.scss | 0 .../src/ui/components/game/ClusterCover.tsx | 0 .../src/ui/components/game/LoaderIcon.tsx | 0 .../src/ui/components/game/PlayerHead.tsx | 0 .../src/ui/components/game/WorldIcon.tsx | 0 .../src/ui/components/overlay/ContextMenu.tsx | 0 .../components/overlay/FullscreenOverlay.tsx | 0 .../src/ui/components/overlay/Modal.tsx | 0 .../src/ui/components/overlay/Popup.tsx | 0 .../overlay/account/AccountsPopup.tsx | 0 .../overlay/account/AddAccountModal.tsx | 0 .../overlay/cluster/ClusterCreationModal.tsx | 0 .../overlay/cluster/ClusterGameSetup.tsx | 0 .../cluster/ClusterImportSelection.tsx | 0 .../cluster/ClusterProviderSelection.tsx | 0 .../notifications/NotificationComponent.tsx | 0 .../notifications/NotificationOverlay.tsx | 0 .../notifications/NotificationPopup.tsx | 0 .../frontend/src/ui/hooks/useBrowser.tsx | 0 .../frontend/src/ui/hooks/useCluster.tsx | 0 .../frontend/src/ui/hooks/useCommand.ts | 0 .../src/ui/hooks/useNotifications.tsx | 0 .../frontend/src/ui/hooks/usePagination.tsx | 0 .../frontend/src/ui/hooks/usePreventLeave.tsx | 0 .../frontend/src/ui/hooks/useProcessor.tsx | 0 .../frontend/src/ui/hooks/usePromptOpener.tsx | 0 .../frontend/src/ui/hooks/useSettings.tsx | 0 .../frontend/src/ui/pages/App.tsx | 0 .../frontend/src/ui/pages/Home.tsx | 0 .../frontend/src/ui/pages/Updates.tsx | 0 .../src/ui/pages/browser/BrowserMain.tsx | 0 .../src/ui/pages/browser/BrowserPackage.tsx | 0 .../src/ui/pages/browser/BrowserRoot.tsx | 0 .../src/ui/pages/browser/BrowserSearch.tsx | 0 .../src/ui/pages/cluster/ClusterGame.tsx | 0 .../src/ui/pages/cluster/ClusterLogs.tsx | 0 .../src/ui/pages/cluster/ClusterMods.tsx | 0 .../src/ui/pages/cluster/ClusterOverview.tsx | 0 .../src/ui/pages/cluster/ClusterRoot.tsx | 0 .../ui/pages/cluster/ClusterScreenshots.tsx | 0 .../src/ui/pages/cluster/ClusterSettings.tsx | 0 .../src/ui/pages/cluster/ClusterWorlds.tsx | 0 .../src/ui/pages/onboarding/Onboarding.tsx | 0 .../pages/onboarding/OnboardingComplete.tsx | 0 .../ui/pages/onboarding/OnboardingImport.tsx | 0 .../pages/onboarding/OnboardingLanguage.tsx | 0 .../ui/pages/onboarding/OnboardingLogin.tsx | 0 .../ui/pages/onboarding/OnboardingSummary.tsx | 0 .../ui/pages/onboarding/OnboardingWelcome.tsx | 0 .../src/ui/pages/settings/SettingsRoot.tsx | 0 .../settings/about/SettingsChangelog.tsx | 0 .../settings/about/SettingsDeveloper.tsx | 0 .../pages/settings/about/SettingsFeedback.tsx | 0 .../pages/settings/game/SettingsAccounts.tsx | 0 .../pages/settings/game/SettingsMinecraft.tsx | 0 .../settings/launcher/SettingsAppearance.tsx | 0 .../settings/launcher/SettingsGeneral.tsx | 0 .../frontend/src/utils/browser.ts | 0 .../frontend/src/utils/environment.ts | 0 .../frontend/src/utils/index.ts | 0 .../frontend/src/utils/patches.ts | 0 .../frontend/src/utils/query.ts | 0 .../frontend/src/utils/theming.ts | 0 .../frontend/src/utils/updater.tsx | 0 .../frontend/src/vite-env.d.ts | 0 apps/{ => onelauncher}/frontend/tsconfig.json | 0 .../frontend/tsconfig.node.json | 0 apps/{ => onelauncher}/frontend/uno.config.ts | 0 .../{ => onelauncher}/frontend/vite.config.ts | 0 .../frontend/vitest.config.ts | 0 apps/testing/Cargo.toml | 20 -- apps/testing/examples/cluster_packages.rs | 125 ---------- apps/testing/examples/murmur2_hash.rs | 14 -- apps/testing/examples/search_packages.rs | 34 --- apps/testing/index.html | 14 -- apps/testing/package.json | 17 -- apps/testing/src/main.rs | 165 ------------ packages/distribution/macos/.gitkeep | 0 packages/distribution/package.json | 17 -- packages/distribution/rpm/.gitkeep | 0 packages/distribution/snapcraft/.gitkeep | 0 215 files changed, 707 insertions(+), 1103 deletions(-) delete mode 100644 apps/desktop/src/api/commands/cluster.rs delete mode 100644 apps/desktop/src/api/commands/package.rs delete mode 100644 apps/desktop/src/api/commands/processor.rs delete mode 100644 apps/desktop/src/api/commands/users.rs rename apps/{ => onelauncher}/desktop/.gitignore (100%) rename apps/{ => onelauncher}/desktop/App.entitlements (100%) rename apps/{ => onelauncher}/desktop/Cargo.toml (100%) rename apps/{ => onelauncher}/desktop/Info.plist (100%) rename apps/{ => onelauncher}/desktop/build.rs (100%) rename apps/{ => onelauncher}/desktop/capabilities/default.json (100%) rename apps/{ => onelauncher}/desktop/package.json (88%) rename apps/{ => onelauncher}/desktop/src/api/commands.rs (54%) create mode 100644 apps/onelauncher/desktop/src/api/commands/cluster.rs create mode 100644 apps/onelauncher/desktop/src/api/commands/package.rs create mode 100644 apps/onelauncher/desktop/src/api/commands/processor.rs create mode 100644 apps/onelauncher/desktop/src/api/commands/users.rs rename apps/{ => onelauncher}/desktop/src/api/events.rs (100%) rename apps/{ => onelauncher}/desktop/src/api/mod.rs (100%) rename apps/{ => onelauncher}/desktop/src/api/statics.rs (100%) rename apps/{ => onelauncher}/desktop/src/constants.rs (100%) rename apps/{ => onelauncher}/desktop/src/ext/mod.rs (100%) rename apps/{ => onelauncher}/desktop/src/ext/specta.rs (84%) rename apps/{ => onelauncher}/desktop/src/ext/updater.rs (100%) rename apps/{ => onelauncher}/desktop/src/lib.rs (80%) rename apps/{ => onelauncher}/desktop/src/main.rs (100%) rename apps/{ => onelauncher}/desktop/tauri.conf.json (84%) rename {packages => apps/onelauncher}/distribution/aur/cli/PKGBUILD (100%) rename {packages => apps/onelauncher}/distribution/aur/gui/PKGBUILD (100%) rename {packages => apps/onelauncher}/distribution/brew/onelauncher.rb (100%) rename {packages => apps/onelauncher}/distribution/flatpak/org.polyfrost.launcher.desktop (100%) rename {packages => apps/onelauncher}/distribution/flatpak/org.polyfrost.launcher.metainfo.xml (100%) rename {packages => apps/onelauncher}/distribution/flatpak/org.polyfrost.launcher.yml (100%) rename {packages => apps/onelauncher}/distribution/icons/128x128.png (100%) rename {packages => apps/onelauncher}/distribution/icons/128x128@2x.png (100%) rename {packages => apps/onelauncher}/distribution/icons/32x32.png (100%) rename {packages => apps/onelauncher}/distribution/icons/512x512.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square107x107Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square142x142Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square150x150Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square284x284Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square30x30Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square310x310Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square44x44Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square71x71Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/Square89x89Logo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/StoreLogo.png (100%) rename {packages => apps/onelauncher}/distribution/icons/icon.icns (100%) rename {packages => apps/onelauncher}/distribution/icons/icon.ico (100%) rename {packages => apps/onelauncher}/distribution/icons/icon.png (100%) rename {packages => apps/onelauncher}/distribution/linux/org.polyfrost.launcher.desktop.template (100%) rename {packages => apps/onelauncher}/distribution/scoop/onelauncher.json (100%) rename {packages => apps/onelauncher}/distribution/winget/Polyfrost.OneLauncher.installer.yaml (100%) rename {packages => apps/onelauncher}/distribution/winget/Polyfrost.OneLauncher.locale.en-US.yaml (100%) rename {packages => apps/onelauncher}/distribution/winget/Polyfrost.OneLauncher.yaml (100%) rename apps/{ => onelauncher}/frontend/dist/.gitignore (100%) rename apps/{ => onelauncher}/frontend/index.html (100%) rename apps/{ => onelauncher}/frontend/isolation/index.html (100%) rename apps/{ => onelauncher}/frontend/isolation/index.js (100%) rename apps/{ => onelauncher}/frontend/package.json (100%) rename apps/{ => onelauncher}/frontend/src/RootLayout.tsx (100%) rename apps/{ => onelauncher}/frontend/src/assets/illustrations/onboarding/import_from_others.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/illustrations/onboarding/language.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/images/default_instance_cover.jpg (100%) rename apps/{ => onelauncher}/frontend/src/assets/images/default_world.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/images/header.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/images/steve.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/curseforge.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/discord.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/launchers/atlauncher.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/launchers/ftb.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/launchers/gdlauncher.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/launchers/multimc.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/launchers/prismlauncher.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/launchers/technic.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/launchers/tlauncher.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/loaders/fabric.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/loaders/forge.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/loaders/neoforge.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/loaders/quilt.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/microsoft.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/minecraft.png (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/modrinth.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/oneconfig.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/onelauncher.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/onelauncher_full.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/onelauncher_text.svg (100%) rename apps/{ => onelauncher}/frontend/src/assets/logos/skyclient.png (100%) rename apps/{ => onelauncher}/frontend/src/imports.ts (100%) rename apps/{ => onelauncher}/frontend/src/index.tsx (100%) rename apps/{ => onelauncher}/frontend/src/styles/globals.scss (100%) rename apps/{ => onelauncher}/frontend/src/styles/highlightjs.css (100%) rename apps/{ => onelauncher}/frontend/src/styles/themes/_OneLauncher.scss (100%) rename apps/{ => onelauncher}/frontend/src/styles/themes/_helpers.scss (100%) rename apps/{ => onelauncher}/frontend/src/styles/themes/index.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/AnimatedRoutes.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/DynamicTime.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/ErrorBoundary.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/LaunchButton.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/MultiProvider.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/Navbar.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/ScrollableContainer.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/SettingsRow.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/Sidebar.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/Spinner.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/WindowFrame.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Button.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Button.test.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Button.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Checkbox.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Checkbox.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Dropdown.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Dropdown.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/FilePicker.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Link.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Link.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/SelectList.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/SelectList.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Tag.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Tag.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/TextField.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/TextField.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Toggle.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Tooltip.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/base/Tooltip.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/content/FormattedLog.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/content/FormattedLog.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/content/LauncherIcon.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/content/LauncherImportComponent.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/content/Markdown.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/content/Markdown.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/content/ProviderIcon.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/content/SearchResults.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/game/ClusterCover.module.scss (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/game/ClusterCover.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/game/LoaderIcon.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/game/PlayerHead.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/game/WorldIcon.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/ContextMenu.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/FullscreenOverlay.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/Modal.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/Popup.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/account/AccountsPopup.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/account/AddAccountModal.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/cluster/ClusterCreationModal.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/cluster/ClusterGameSetup.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/cluster/ClusterImportSelection.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/cluster/ClusterProviderSelection.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/notifications/NotificationComponent.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/notifications/NotificationOverlay.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/components/overlay/notifications/NotificationPopup.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/useBrowser.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/useCluster.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/useCommand.ts (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/useNotifications.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/usePagination.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/usePreventLeave.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/useProcessor.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/usePromptOpener.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/hooks/useSettings.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/App.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/Home.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/Updates.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/browser/BrowserMain.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/browser/BrowserPackage.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/browser/BrowserRoot.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/browser/BrowserSearch.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/cluster/ClusterGame.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/cluster/ClusterLogs.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/cluster/ClusterMods.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/cluster/ClusterOverview.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/cluster/ClusterRoot.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/cluster/ClusterScreenshots.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/cluster/ClusterSettings.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/cluster/ClusterWorlds.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/onboarding/Onboarding.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/onboarding/OnboardingComplete.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/onboarding/OnboardingImport.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/onboarding/OnboardingLanguage.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/onboarding/OnboardingLogin.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/onboarding/OnboardingSummary.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/onboarding/OnboardingWelcome.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/settings/SettingsRoot.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/settings/about/SettingsChangelog.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/settings/about/SettingsDeveloper.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/settings/about/SettingsFeedback.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/settings/game/SettingsAccounts.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/settings/game/SettingsMinecraft.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/settings/launcher/SettingsAppearance.tsx (100%) rename apps/{ => onelauncher}/frontend/src/ui/pages/settings/launcher/SettingsGeneral.tsx (100%) rename apps/{ => onelauncher}/frontend/src/utils/browser.ts (100%) rename apps/{ => onelauncher}/frontend/src/utils/environment.ts (100%) rename apps/{ => onelauncher}/frontend/src/utils/index.ts (100%) rename apps/{ => onelauncher}/frontend/src/utils/patches.ts (100%) rename apps/{ => onelauncher}/frontend/src/utils/query.ts (100%) rename apps/{ => onelauncher}/frontend/src/utils/theming.ts (100%) rename apps/{ => onelauncher}/frontend/src/utils/updater.tsx (100%) rename apps/{ => onelauncher}/frontend/src/vite-env.d.ts (100%) rename apps/{ => onelauncher}/frontend/tsconfig.json (100%) rename apps/{ => onelauncher}/frontend/tsconfig.node.json (100%) rename apps/{ => onelauncher}/frontend/uno.config.ts (100%) rename apps/{ => onelauncher}/frontend/vite.config.ts (100%) rename apps/{ => onelauncher}/frontend/vitest.config.ts (100%) delete mode 100644 apps/testing/Cargo.toml delete mode 100644 apps/testing/examples/cluster_packages.rs delete mode 100644 apps/testing/examples/murmur2_hash.rs delete mode 100644 apps/testing/examples/search_packages.rs delete mode 100644 apps/testing/index.html delete mode 100644 apps/testing/package.json delete mode 100644 apps/testing/src/main.rs delete mode 100644 packages/distribution/macos/.gitkeep delete mode 100644 packages/distribution/package.json delete mode 100644 packages/distribution/rpm/.gitkeep delete mode 100644 packages/distribution/snapcraft/.gitkeep diff --git a/.vscode/settings.json b/.vscode/settings.json index 1d162a47..964a7559 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -20,12 +20,14 @@ "**/.cargo": true, "**/.crates": true }, - "rust-analyzer.procMacro.enable": true, - "rust-analyzer.procMacro.attributes.enable": true, + "rust-analyzer.procMacro.enable": false, + "rust-analyzer.procMacro.attributes.enable": false, "rust-analyzer.procMacro.ignored": { - "async-trait": ["async_trait"] + "async-trait": ["async_trait"], + "specta": ["specta"], + "tauri-specta": ["command"] }, - "rust-analyzer.check.command": "clippy", + "rust-analyzer.check.command": "check", "rust-analyzer.diagnostics.experimental.enable": false, "rust-analyzer.linkedProjects": [], "rust-analyzer.cargo.extraEnv": {}, diff --git a/Cargo.toml b/Cargo.toml index 27fac791..85c5c90d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] members = [ - "apps/desktop", + "apps/onelauncher/desktop", "packages/core", "packages/entity", "packages/gamemode", diff --git a/apps/desktop/src/api/commands/cluster.rs b/apps/desktop/src/api/commands/cluster.rs deleted file mode 100644 index 1ac284ac..00000000 --- a/apps/desktop/src/api/commands/cluster.rs +++ /dev/null @@ -1,217 +0,0 @@ -use std::collections::HashMap; -use std::path::PathBuf; -use std::str::FromStr; - -use onelauncher_core::cluster::content::logger; -use onelauncher_core::cluster::{self}; -use onelauncher_core::data::{Loader, PackageData}; -use onelauncher_core::processor::DetailedProcess; -use onelauncher_core::store::{Cluster, ClusterPath}; -use onelauncher_core::api::java::JavaInfo; -use onelauncher_core::store::State; -use serde::{Deserialize, Serialize}; -use specta::Type; -use uuid::Uuid; - -#[specta::specta] -#[tauri::command] -pub async fn get_cluster(uuid: Uuid) -> Result { - (cluster::get_by_uuid(uuid).await?).map_or_else(|| Err("Cluster does not exist".into()), Ok) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_clusters() -> Result, String> { - Ok(cluster::list().await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_clusters_grouped() -> Result>, String> { - Ok(cluster::list_grouped().await?) -} - -#[derive(Serialize, Deserialize, Type)] -pub struct CreateCluster { - name: String, - mc_version: String, - mod_loader: Loader, - loader_version: Option, - icon: Option, - icon_url: Option, - package_data: Option, - skip: Option, - skip_watch: Option, -} - -#[specta::specta] -#[tauri::command] -pub async fn create_cluster(props: CreateCluster) -> Result { - let path = cluster::create::create_cluster( - props.name, - props.mc_version, - props.mod_loader, - props.loader_version, - props.icon, - props.icon_url, - props.package_data, - props.skip, - props.skip_watch, - ) - .await?; - - if let Some(cluster) = cluster::get(&path).await? { - Ok(cluster.uuid) - } else { - Err("Cluster does not exist".to_string()) - } -} - -/// Updates the cluster with the given UUID. The cluster only updates game setting fields -#[specta::specta] -#[tauri::command] -pub async fn edit_game_settings(uuid: Uuid, new_cluster: Cluster) -> Result<(), String> { - let cluster_path = ClusterPath::find_by_uuid(uuid).await?; - - cluster::edit(&cluster_path, |old| { - old.force_fullscreen = new_cluster.force_fullscreen; - old.resolution = new_cluster.resolution; - old.memory = new_cluster.memory; - old.init_hooks.clone_from(&new_cluster.init_hooks); - old.java.clone_from(&new_cluster.java); - - async move { Ok(()) } - }) - .await?; - - State::sync().await?; - - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn edit_cluster_meta( - uuid: Uuid, - name: Option, - icon_path: Option, -) -> Result<(), String> { - let cluster = cluster::get_by_uuid(uuid) - .await? - .ok_or("cluster does not exist")?; - - cluster::edit(&cluster.cluster_path(), move |cluster| { - if let Some(name) = name.clone() { - cluster.meta.name = name; - } - - async move { Ok(()) } - }) - .await?; - - let icon_path = icon_path.and_then(|x| PathBuf::from_str(x.as_str()).ok()); - cluster::edit_icon(&cluster.cluster_path(), icon_path.as_deref()).await?; - - State::sync().await?; - - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn remove_cluster(uuid: Uuid) -> Result<(), String> { - let path = ClusterPath::find_by_uuid(uuid).await?; - Ok(cluster::remove(&path).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn run_cluster(uuid: Uuid) -> Result { - let path = ClusterPath::find_by_uuid(uuid).await?; - let c_lock = cluster::run_default(&path).await?; - let child = &*c_lock.read().await; - - Ok(DetailedProcess::from_processor_child(child).await) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_cluster_logs(uuid: Uuid) -> Result, String> { - let cluster = cluster::get_by_uuid(uuid) - .await? - .ok_or("cluster not found")?; - let logs = logger::get_logs(&cluster.cluster_path(), None) - .await? - .iter() - .map(|x| x.log_file.clone()) - .collect(); - Ok(logs) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_cluster_log(uuid: Uuid, log_name: String) -> Result { - let cluster = cluster::get_by_uuid(uuid) - .await? - .ok_or("cluster not found")?; - let log = logger::get_output_by_file(&cluster.cluster_path(), logger::LogType::Info, &log_name) - .await?; - Ok(log.0) -} - -#[specta::specta] -#[tauri::command] -pub async fn upload_log(uuid: Uuid, log_name: String) -> Result { - let cluster = cluster::get_by_uuid(uuid) - .await? - .ok_or("cluster not found")?; - let log = logger::get_output_by_file(&cluster.cluster_path(), logger::LogType::Info, &log_name) - .await?; - - let id = logger::upload_log(&cluster.cluster_path(), log).await?; - Ok(id) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_screenshots(uuid: Uuid) -> Result, String> { - let cluster = cluster::get_by_uuid(uuid) - .await? - .ok_or("cluster not found")?; - - let screenshots = - cluster::content::screenshots::get_screenshots(&cluster.cluster_path()).await?; - - Ok(screenshots) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_worlds(uuid: Uuid) -> Result, String> { - let cluster = cluster::get_by_uuid(uuid) - .await? - .ok_or("cluster not found")?; - - let screenshots = cluster::content::worlds::get_worlds(&cluster.cluster_path()).await?; - - Ok(screenshots) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_optimal_java_version(uuid: Uuid) -> Result { - let cluster_path = cluster::get_by_uuid(uuid).await?.ok_or("Cluster not found")?.cluster_path(); - Ok(cluster::get_optimal_java_version(&cluster_path).await?.ok_or("No Java version found")?) -} - -#[specta::specta] -#[tauri::command] -pub async fn repair_cluster(uuid: Uuid) -> Result<(), String> { - let cluster = cluster::get_by_uuid(uuid) - .await? - .ok_or("cluster not found")?; - - cluster::repair_cluster(&cluster.cluster_path()).await?; - - Ok(()) -} \ No newline at end of file diff --git a/apps/desktop/src/api/commands/package.rs b/apps/desktop/src/api/commands/package.rs deleted file mode 100644 index 982bc386..00000000 --- a/apps/desktop/src/api/commands/package.rs +++ /dev/null @@ -1,234 +0,0 @@ -use std::path::PathBuf; - -use onelauncher::cluster::content::package; -use onelauncher::data::{Loader, ManagedPackage, ManagedUser, ManagedVersion, PackageType}; -use onelauncher::package::content::Providers; -use onelauncher::package::import::ImportType; -use onelauncher::store::{ - Author, ClusterPath, Package, PackageBody, PackagePath, ProviderSearchResults, -}; -use onelauncher::utils::pagination::Pagination; -use uuid::Uuid; - -#[specta::specta] -#[tauri::command] -pub async fn get_launcher_instances( - launcher: ImportType, - path: Option, -) -> Result<(String, Vec), String> { - let (dir, instances) = onelauncher::api::package::import::get_launcher_instances(launcher, path).await?; - Ok(( - dir.to_str().ok_or("could not convert pathbuf to string")?.to_string(), - instances - )) -} - -#[specta::specta] -#[tauri::command] -pub async fn import_instances( - launcher: ImportType, - base_path: PathBuf, - instances: Vec, -) -> Result<(), String> { - onelauncher::api::package::import::import_instances(launcher, base_path, instances).await?; - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_provider_package( - provider: Providers, - project_id: String, -) -> Result { - Ok(provider.get(&project_id).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_provider_packages( - provider: Providers, - project_ids: Vec, -) -> Result, String> { - Ok(provider.get_multiple(&project_ids).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_all_provider_package_versions( - provider: Providers, - project_id: String, - game_versions: Option>, - loaders: Option>, - page: Option, - page_size: Option, -) -> Result<(Vec, Pagination), String> { - Ok(provider - .get_all_versions(&project_id, game_versions, loaders, page, page_size) - .await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_provider_package_versions( - provider: Providers, - versions: Vec, -) -> Result, String> { - Ok(provider.get_versions(versions).await?) -} - -#[derive(specta::Type, serde::Deserialize, serde::Serialize)] -pub struct ProviderSearchQuery { - query: Option, - limit: Option, - offset: Option, - game_versions: Option>, - categories: Option>, - loaders: Option>, - package_types: Option>, - open_source: Option, -} - -#[specta::specta] -#[tauri::command] -pub async fn search_provider_packages( - provider: Providers, - query: ProviderSearchQuery, -) -> Result { - Ok(provider - .search( - query.query, - query.limit, - query.offset, - query.game_versions, - query.categories, - query.loaders, - query.package_types, - query.open_source, - ) - .await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_provider_authors( - provider: Providers, - author: Author, -) -> Result, String> { - Ok(provider.get_authors(&author).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_package_body(provider: Providers, body: PackageBody) -> Result { - Ok(provider.get_package_body(&body).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn download_provider_package( - provider: Providers, - package_id: String, - cluster_id: Uuid, - game_version: Option, - loader: Option, - package_version: Option, -) -> Result<(), String> { - let mut cluster = onelauncher::cluster::get_by_uuid(cluster_id) - .await? - .ok_or("cluster not found")?; - - let mgd_pkg = provider.get(&package_id).await?; - - let (pkg_path, pkg) = package::download_package( - &mgd_pkg, - &mut cluster, - game_version, - loader, - package_version, - ) - .await?; - - package::add_package( - &cluster.cluster_path(), - pkg_path, - pkg, - ) - .await?; - - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_cluster_package( - cluster_path: ClusterPath, - package_path: PackagePath, - package_type: PackageType, -) -> Result { - Ok(package::get_package(&cluster_path, &package_path, package_type).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_cluster_packages( - cluster_path: ClusterPath, - package_type: PackageType, -) -> Result, String> { - Ok(package::get_packages(&cluster_path, package_type).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn add_cluster_package( - cluster_path: ClusterPath, - file_name: String, - package_type: PackageType, - pkg: Package, -) -> Result<(), String> { - let package_path = PackagePath::new(package_type, file_name)?; - package::add_package(&cluster_path, package_path, pkg).await?; - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn remove_cluster_package( - cluster_path: ClusterPath, - file_name: String, - package_type: PackageType, -) -> Result<(), String> { - let package_path = PackagePath::new(package_type, file_name)?; - package::remove_package(&cluster_path, &package_path).await?; - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn set_cluster_package_enabled( - cluster_path: ClusterPath, - file_name: String, - package_type: PackageType, - enabled: bool, -) -> Result<(), String> { - let package_path = PackagePath::new(package_type, file_name)?; - package::set_package_enabled(&cluster_path, &package_path, enabled).await?; - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn sync_cluster_packages(cluster_path: ClusterPath) -> Result<(), String> { - package::sync_packages(&cluster_path).await?; - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn sync_cluster_packages_by_type( - cluster_path: ClusterPath, - package_type: PackageType, - clear: Option, -) -> Result<(), String> { - package::sync_packages_by_type(&cluster_path, package_type, clear).await?; - Ok(()) -} diff --git a/apps/desktop/src/api/commands/processor.rs b/apps/desktop/src/api/commands/processor.rs deleted file mode 100644 index e37eab82..00000000 --- a/apps/desktop/src/api/commands/processor.rs +++ /dev/null @@ -1,61 +0,0 @@ -use chrono::{DateTime, Utc}; -use onelauncher::processor::{self, DetailedProcess}; -use onelauncher::store::{Cluster, ClusterPath}; -use uuid::Uuid; - -#[specta::specta] -#[tauri::command] -pub async fn get_running_clusters() -> Result, String> { - Ok(processor::get_running_clusters().await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn is_cluster_running(uuid: Uuid) -> Result { - Ok(processor::is_cluster_running(uuid).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_processes_by_path(path: ClusterPath) -> Result, String> { - Ok(processor::get_uuids_by_cluster_path(path).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_processes_detailed_by_path( - path: ClusterPath, -) -> Result, String> { - Ok(processor::get_processes_detailed_by_path(path).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_process_detailed_by_id(uuid: Uuid) -> Result { - Ok(processor::get_process_detailed_by_id(uuid).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_user_by_process(uuid: Uuid) -> Result, String> { - Ok(processor::get_user_by_process(uuid).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_process_started_at(uuid: Uuid) -> Result, String> { - Ok(processor::get_process_started_at(uuid).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_pid_by_uuid(uuid: Uuid) -> Result { - Ok(processor::get_pid_by_uuid(uuid).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn kill_process(uuid: Uuid) -> Result<(), String> { - processor::kill_by_uuid(uuid).await?; - Ok(()) -} diff --git a/apps/desktop/src/api/commands/users.rs b/apps/desktop/src/api/commands/users.rs deleted file mode 100644 index 16127d76..00000000 --- a/apps/desktop/src/api/commands/users.rs +++ /dev/null @@ -1,119 +0,0 @@ -use onelauncher::data::MinecraftCredentials; -use onelauncher::minecraft; -use onelauncher::store::MinecraftLogin; -use tauri::{AppHandle, Manager}; -use uuid::Uuid; - -#[specta::specta] -#[tauri::command] -pub async fn get_users() -> Result, String> { - Ok(minecraft::users().await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_user(uuid: Uuid) -> Result { - Ok(minecraft::get_user(uuid).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn remove_user(uuid: Uuid) -> Result<(), String> { - Ok(minecraft::remove_user(uuid).await?) -} - -#[specta::specta] -#[tauri::command] -pub async fn get_default_user( - fallback: Option, -) -> Result, String> { - let uuid = minecraft::get_default_user().await?; - - if let Some(fallback) = fallback { - if fallback && uuid.is_none() { - return Ok(minecraft::users().await?.first().cloned()); - } - } - - match uuid { - Some(uuid) => Ok(Some(minecraft::get_user(uuid).await?)), - None => Ok(None), - } -} - -#[specta::specta] -#[tauri::command] -pub async fn set_default_user(uuid: Option) -> Result<(), String> { - minecraft::set_default_user(uuid).await?; - Ok(()) -} - -#[specta::specta] -#[tauri::command] -pub async fn auth_login(handle: AppHandle) -> Result, String> { - let flow = minecraft::begin().await?; - let result = spawn_webview(handle, flow).await?; - - Ok(result) -} - -async fn spawn_webview( - handle: AppHandle, - flow: MinecraftLogin, -) -> Result, String> { - let now = chrono::Utc::now(); - - if let Some(win) = handle.get_webview_window("login") { - win.close().map_err(|err| err.to_string())?; - } - - let win = tauri::WebviewWindowBuilder::new( - &handle, - "login", - tauri::WebviewUrl::External( - flow.redirect_uri - .parse() - .map_err(|_| anyhow::anyhow!("failed to parse auth redirect url")) - .map_err(|err| err.to_string())?, - ), - ) - .title("Log into OneLauncher") - .always_on_top(true) - .center() - .build() - .map_err(|err| err.to_string())?; - - win.request_user_attention(Some(tauri::UserAttentionType::Critical)) - .map_err(|err| err.to_string())?; - - while (chrono::Utc::now() - now) < chrono::Duration::minutes(10) { - if win.title().is_err() { - return Ok(None); - } - - if win - .url() - .map_err(|err| err.to_string())? - .as_str() - .starts_with("https://login.live.com/oauth20_desktop.srf") - { - if let Some((_, code)) = win - .url() - .map_err(|err| err.to_string())? - .query_pairs() - .find(|x| x.0 == "code") - { - win.close().map_err(|err| err.to_string())?; - let value = minecraft::finish(&code.clone(), flow).await?; - - return Ok(Some(value)); - } - } - - tokio::time::sleep(std::time::Duration::from_millis(50)).await; - } - - win.close().map_err(|err| err.to_string())?; - - Ok(None) -} diff --git a/apps/desktop/.gitignore b/apps/onelauncher/desktop/.gitignore similarity index 100% rename from apps/desktop/.gitignore rename to apps/onelauncher/desktop/.gitignore diff --git a/apps/desktop/App.entitlements b/apps/onelauncher/desktop/App.entitlements similarity index 100% rename from apps/desktop/App.entitlements rename to apps/onelauncher/desktop/App.entitlements diff --git a/apps/desktop/Cargo.toml b/apps/onelauncher/desktop/Cargo.toml similarity index 100% rename from apps/desktop/Cargo.toml rename to apps/onelauncher/desktop/Cargo.toml diff --git a/apps/desktop/Info.plist b/apps/onelauncher/desktop/Info.plist similarity index 100% rename from apps/desktop/Info.plist rename to apps/onelauncher/desktop/Info.plist diff --git a/apps/desktop/build.rs b/apps/onelauncher/desktop/build.rs similarity index 100% rename from apps/desktop/build.rs rename to apps/onelauncher/desktop/build.rs diff --git a/apps/desktop/capabilities/default.json b/apps/onelauncher/desktop/capabilities/default.json similarity index 100% rename from apps/desktop/capabilities/default.json rename to apps/onelauncher/desktop/capabilities/default.json diff --git a/apps/desktop/package.json b/apps/onelauncher/desktop/package.json similarity index 88% rename from apps/desktop/package.json rename to apps/onelauncher/desktop/package.json index b60cc639..8e909ca1 100644 --- a/apps/desktop/package.json +++ b/apps/onelauncher/desktop/package.json @@ -19,8 +19,6 @@ "tauri-ext": "pnpm --filter @onelauncher/scripts -- tauri" }, "dependencies": { - "@onelauncher/core": "workspace:*", - "@onelauncher/distribution": "workspace:*", "@onelauncher/frontend": "workspace:*" }, "devDependencies": { diff --git a/apps/desktop/src/api/commands.rs b/apps/onelauncher/desktop/src/api/commands.rs similarity index 54% rename from apps/desktop/src/api/commands.rs rename to apps/onelauncher/desktop/src/api/commands.rs index ebb3c82f..913cc25c 100644 --- a/apps/desktop/src/api/commands.rs +++ b/apps/onelauncher/desktop/src/api/commands.rs @@ -1,23 +1,23 @@ -use interpulse::api::minecraft::Version; -use tauri::{AppHandle, Manager}; +// use interpulse::api::minecraft::Version; +// use tauri::{AppHandle, Manager}; mod cluster; -pub use crate::api::commands::cluster::*; +// pub use crate::api::commands::cluster::*; mod users; -pub use crate::api::commands::users::*; +// pub use crate::api::commands::users::*; mod processor; -pub use crate::api::commands::processor::*; +// pub use crate::api::commands::processor::*; mod package; -pub use crate::api::commands::package::*; +// pub use crate::api::commands::package::*; #[macro_export] macro_rules! collect_commands { () => {{ - use $crate::api::commands::*; - use $crate::ext::updater::*; + // use $crate::api::commands::*; + // use $crate::ext::updater::*; tauri_specta::collect_commands![ // User // auth_login, @@ -92,9 +92,10 @@ macro_rules! collect_commands { } #[onelauncher_core::command] -pub fn open_dev_tools(_webview: tauri::WebviewWindow) { +#[allow(unused_parens)] +pub fn open_dev_tools(webview: &tauri::WebviewWindow) { #[cfg(feature = "devtools")] - _webview.open_devtools(); + webview.open_devtools(); } // #[onelauncher_core::command] @@ -102,40 +103,40 @@ pub fn open_dev_tools(_webview: tauri::WebviewWindow) { // Ok(onelauncher::java::get_zulu_packages().await?) // } -#[onelauncher_core::command] -pub async fn install_java_from_package(download: onelauncher::java::JavaZuluPackage) -> Result { - Ok(onelauncher::java::install_java_from_package(download).await?) -} +// #[onelauncher_core::command] +// pub async fn install_java_from_package(download: onelauncher::java::JavaZuluPackage) -> Result { +// Ok(onelauncher::java::install_java_from_package(download).await?) +// } -#[onelauncher_core::command] -pub async fn get_featured_packages() -> Result, String> { - Ok(onelauncher::package::content::get_featured_packages().await?) -} +// #[onelauncher_core::command] +// pub async fn get_featured_packages() -> Result, String> { +// Ok(onelauncher::package::content::get_featured_packages().await?) +// } -#[onelauncher_core::command] -pub fn get_program_info() -> Result { - Ok(super::statics::get_program_info()) -} +// #[onelauncher_core::command] +// pub fn get_program_info() -> Result { +// Ok(super::statics::get_program_info()) +// } -#[onelauncher_core::command] -pub async fn get_minecraft_versions() -> Result, String> { - Ok(onelauncher::api::metadata::get_minecraft_versions() - .await? - .versions) -} +// #[onelauncher_core::command] +// pub async fn get_minecraft_versions() -> Result, String> { +// Ok(onelauncher::api::metadata::get_minecraft_versions() +// .await? +// .versions) +// } -#[onelauncher_core::command] -pub async fn get_settings() -> Result { - Ok(settings::get().await?) -} +// #[onelauncher_core::command] +// pub async fn get_settings() -> Result { +// Ok(settings::get().await?) +// } -#[onelauncher_core::command] -pub async fn set_settings(settings: Settings) -> Result<(), String> { - Ok(settings::set(settings).await?) -} +// #[onelauncher_core::command] +// pub async fn set_settings(settings: Settings) -> Result<(), String> { +// Ok(settings::set(settings).await?) +// } -#[onelauncher_core::command] -pub fn set_window_style(handle: AppHandle, custom: bool) -> Result<(), String> { - let window = handle.get_webview_window("main").unwrap(); - onelauncher::utils::window::set_window_styling(&window, custom).map_err(|e| e.to_string()) -} +// #[onelauncher_core::command] +// pub fn set_window_style(handle: AppHandle, custom: bool) -> Result<(), String> { +// let window = handle.get_webview_window("main").unwrap(); +// onelauncher::utils::window::set_window_styling(&window, custom).map_err(|e| e.to_string()) +// } diff --git a/apps/onelauncher/desktop/src/api/commands/cluster.rs b/apps/onelauncher/desktop/src/api/commands/cluster.rs new file mode 100644 index 00000000..84e23d44 --- /dev/null +++ b/apps/onelauncher/desktop/src/api/commands/cluster.rs @@ -0,0 +1,217 @@ +// use std::collections::HashMap; +// use std::path::PathBuf; +// use std::str::FromStr; + +// use onelauncher_core::cluster::content::logger; +// use onelauncher_core::cluster::{self}; +// use onelauncher_core::data::{Loader, PackageData}; +// use onelauncher_core::processor::DetailedProcess; +// use onelauncher_core::store::{Cluster, ClusterPath}; +// use onelauncher_core::api::java::JavaInfo; +// use onelauncher_core::store::State; +// use serde::{Deserialize, Serialize}; +// use specta::Type; +// use uuid::Uuid; + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_cluster(uuid: Uuid) -> Result { +// (cluster::get_by_uuid(uuid).await?).map_or_else(|| Err("Cluster does not exist".into()), Ok) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_clusters() -> Result, String> { +// Ok(cluster::list().await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_clusters_grouped() -> Result>, String> { +// Ok(cluster::list_grouped().await?) +// } + +// #[derive(Serialize, Deserialize, Type)] +// pub struct CreateCluster { +// name: String, +// mc_version: String, +// mod_loader: Loader, +// loader_version: Option, +// icon: Option, +// icon_url: Option, +// package_data: Option, +// skip: Option, +// skip_watch: Option, +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn create_cluster(props: CreateCluster) -> Result { +// let path = cluster::create::create_cluster( +// props.name, +// props.mc_version, +// props.mod_loader, +// props.loader_version, +// props.icon, +// props.icon_url, +// props.package_data, +// props.skip, +// props.skip_watch, +// ) +// .await?; + +// if let Some(cluster) = cluster::get(&path).await? { +// Ok(cluster.uuid) +// } else { +// Err("Cluster does not exist".to_string()) +// } +// } + +// /// Updates the cluster with the given UUID. The cluster only updates game setting fields +// #[specta::specta] +// #[tauri::command] +// pub async fn edit_game_settings(uuid: Uuid, new_cluster: Cluster) -> Result<(), String> { +// let cluster_path = ClusterPath::find_by_uuid(uuid).await?; + +// cluster::edit(&cluster_path, |old| { +// old.force_fullscreen = new_cluster.force_fullscreen; +// old.resolution = new_cluster.resolution; +// old.memory = new_cluster.memory; +// old.init_hooks.clone_from(&new_cluster.init_hooks); +// old.java.clone_from(&new_cluster.java); + +// async move { Ok(()) } +// }) +// .await?; + +// State::sync().await?; + +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn edit_cluster_meta( +// uuid: Uuid, +// name: Option, +// icon_path: Option, +// ) -> Result<(), String> { +// let cluster = cluster::get_by_uuid(uuid) +// .await? +// .ok_or("cluster does not exist")?; + +// cluster::edit(&cluster.cluster_path(), move |cluster| { +// if let Some(name) = name.clone() { +// cluster.meta.name = name; +// } + +// async move { Ok(()) } +// }) +// .await?; + +// let icon_path = icon_path.and_then(|x| PathBuf::from_str(x.as_str()).ok()); +// cluster::edit_icon(&cluster.cluster_path(), icon_path.as_deref()).await?; + +// State::sync().await?; + +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn remove_cluster(uuid: Uuid) -> Result<(), String> { +// let path = ClusterPath::find_by_uuid(uuid).await?; +// Ok(cluster::remove(&path).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn run_cluster(uuid: Uuid) -> Result { +// let path = ClusterPath::find_by_uuid(uuid).await?; +// let c_lock = cluster::run_default(&path).await?; +// let child = &*c_lock.read().await; + +// Ok(DetailedProcess::from_processor_child(child).await) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_cluster_logs(uuid: Uuid) -> Result, String> { +// let cluster = cluster::get_by_uuid(uuid) +// .await? +// .ok_or("cluster not found")?; +// let logs = logger::get_logs(&cluster.cluster_path(), None) +// .await? +// .iter() +// .map(|x| x.log_file.clone()) +// .collect(); +// Ok(logs) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_cluster_log(uuid: Uuid, log_name: String) -> Result { +// let cluster = cluster::get_by_uuid(uuid) +// .await? +// .ok_or("cluster not found")?; +// let log = logger::get_output_by_file(&cluster.cluster_path(), logger::LogType::Info, &log_name) +// .await?; +// Ok(log.0) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn upload_log(uuid: Uuid, log_name: String) -> Result { +// let cluster = cluster::get_by_uuid(uuid) +// .await? +// .ok_or("cluster not found")?; +// let log = logger::get_output_by_file(&cluster.cluster_path(), logger::LogType::Info, &log_name) +// .await?; + +// let id = logger::upload_log(&cluster.cluster_path(), log).await?; +// Ok(id) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_screenshots(uuid: Uuid) -> Result, String> { +// let cluster = cluster::get_by_uuid(uuid) +// .await? +// .ok_or("cluster not found")?; + +// let screenshots = +// cluster::content::screenshots::get_screenshots(&cluster.cluster_path()).await?; + +// Ok(screenshots) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_worlds(uuid: Uuid) -> Result, String> { +// let cluster = cluster::get_by_uuid(uuid) +// .await? +// .ok_or("cluster not found")?; + +// let screenshots = cluster::content::worlds::get_worlds(&cluster.cluster_path()).await?; + +// Ok(screenshots) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_optimal_java_version(uuid: Uuid) -> Result { +// let cluster_path = cluster::get_by_uuid(uuid).await?.ok_or("Cluster not found")?.cluster_path(); +// Ok(cluster::get_optimal_java_version(&cluster_path).await?.ok_or("No Java version found")?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn repair_cluster(uuid: Uuid) -> Result<(), String> { +// let cluster = cluster::get_by_uuid(uuid) +// .await? +// .ok_or("cluster not found")?; + +// cluster::repair_cluster(&cluster.cluster_path()).await?; + +// Ok(()) +// } \ No newline at end of file diff --git a/apps/onelauncher/desktop/src/api/commands/package.rs b/apps/onelauncher/desktop/src/api/commands/package.rs new file mode 100644 index 00000000..165a4b23 --- /dev/null +++ b/apps/onelauncher/desktop/src/api/commands/package.rs @@ -0,0 +1,234 @@ +// use std::path::PathBuf; + +// use onelauncher::cluster::content::package; +// use onelauncher::data::{Loader, ManagedPackage, ManagedUser, ManagedVersion, PackageType}; +// use onelauncher::package::content::Providers; +// use onelauncher::package::import::ImportType; +// use onelauncher::store::{ +// Author, ClusterPath, Package, PackageBody, PackagePath, ProviderSearchResults, +// }; +// use onelauncher::utils::pagination::Pagination; +// use uuid::Uuid; + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_launcher_instances( +// launcher: ImportType, +// path: Option, +// ) -> Result<(String, Vec), String> { +// let (dir, instances) = onelauncher::api::package::import::get_launcher_instances(launcher, path).await?; +// Ok(( +// dir.to_str().ok_or("could not convert pathbuf to string")?.to_string(), +// instances +// )) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn import_instances( +// launcher: ImportType, +// base_path: PathBuf, +// instances: Vec, +// ) -> Result<(), String> { +// onelauncher::api::package::import::import_instances(launcher, base_path, instances).await?; +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_provider_package( +// provider: Providers, +// project_id: String, +// ) -> Result { +// Ok(provider.get(&project_id).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_provider_packages( +// provider: Providers, +// project_ids: Vec, +// ) -> Result, String> { +// Ok(provider.get_multiple(&project_ids).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_all_provider_package_versions( +// provider: Providers, +// project_id: String, +// game_versions: Option>, +// loaders: Option>, +// page: Option, +// page_size: Option, +// ) -> Result<(Vec, Pagination), String> { +// Ok(provider +// .get_all_versions(&project_id, game_versions, loaders, page, page_size) +// .await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_provider_package_versions( +// provider: Providers, +// versions: Vec, +// ) -> Result, String> { +// Ok(provider.get_versions(versions).await?) +// } + +// #[derive(specta::Type, serde::Deserialize, serde::Serialize)] +// pub struct ProviderSearchQuery { +// query: Option, +// limit: Option, +// offset: Option, +// game_versions: Option>, +// categories: Option>, +// loaders: Option>, +// package_types: Option>, +// open_source: Option, +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn search_provider_packages( +// provider: Providers, +// query: ProviderSearchQuery, +// ) -> Result { +// Ok(provider +// .search( +// query.query, +// query.limit, +// query.offset, +// query.game_versions, +// query.categories, +// query.loaders, +// query.package_types, +// query.open_source, +// ) +// .await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_provider_authors( +// provider: Providers, +// author: Author, +// ) -> Result, String> { +// Ok(provider.get_authors(&author).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_package_body(provider: Providers, body: PackageBody) -> Result { +// Ok(provider.get_package_body(&body).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn download_provider_package( +// provider: Providers, +// package_id: String, +// cluster_id: Uuid, +// game_version: Option, +// loader: Option, +// package_version: Option, +// ) -> Result<(), String> { +// let mut cluster = onelauncher::cluster::get_by_uuid(cluster_id) +// .await? +// .ok_or("cluster not found")?; + +// let mgd_pkg = provider.get(&package_id).await?; + +// let (pkg_path, pkg) = package::download_package( +// &mgd_pkg, +// &mut cluster, +// game_version, +// loader, +// package_version, +// ) +// .await?; + +// package::add_package( +// &cluster.cluster_path(), +// pkg_path, +// pkg, +// ) +// .await?; + +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_cluster_package( +// cluster_path: ClusterPath, +// package_path: PackagePath, +// package_type: PackageType, +// ) -> Result { +// Ok(package::get_package(&cluster_path, &package_path, package_type).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_cluster_packages( +// cluster_path: ClusterPath, +// package_type: PackageType, +// ) -> Result, String> { +// Ok(package::get_packages(&cluster_path, package_type).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn add_cluster_package( +// cluster_path: ClusterPath, +// file_name: String, +// package_type: PackageType, +// pkg: Package, +// ) -> Result<(), String> { +// let package_path = PackagePath::new(package_type, file_name)?; +// package::add_package(&cluster_path, package_path, pkg).await?; +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn remove_cluster_package( +// cluster_path: ClusterPath, +// file_name: String, +// package_type: PackageType, +// ) -> Result<(), String> { +// let package_path = PackagePath::new(package_type, file_name)?; +// package::remove_package(&cluster_path, &package_path).await?; +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn set_cluster_package_enabled( +// cluster_path: ClusterPath, +// file_name: String, +// package_type: PackageType, +// enabled: bool, +// ) -> Result<(), String> { +// let package_path = PackagePath::new(package_type, file_name)?; +// package::set_package_enabled(&cluster_path, &package_path, enabled).await?; +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn sync_cluster_packages(cluster_path: ClusterPath) -> Result<(), String> { +// package::sync_packages(&cluster_path).await?; +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn sync_cluster_packages_by_type( +// cluster_path: ClusterPath, +// package_type: PackageType, +// clear: Option, +// ) -> Result<(), String> { +// package::sync_packages_by_type(&cluster_path, package_type, clear).await?; +// Ok(()) +// } diff --git a/apps/onelauncher/desktop/src/api/commands/processor.rs b/apps/onelauncher/desktop/src/api/commands/processor.rs new file mode 100644 index 00000000..84a18027 --- /dev/null +++ b/apps/onelauncher/desktop/src/api/commands/processor.rs @@ -0,0 +1,61 @@ +// use chrono::{DateTime, Utc}; +// use onelauncher::processor::{self, DetailedProcess}; +// use onelauncher::store::{Cluster, ClusterPath}; +// use uuid::Uuid; + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_running_clusters() -> Result, String> { +// Ok(processor::get_running_clusters().await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn is_cluster_running(uuid: Uuid) -> Result { +// Ok(processor::is_cluster_running(uuid).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_processes_by_path(path: ClusterPath) -> Result, String> { +// Ok(processor::get_uuids_by_cluster_path(path).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_processes_detailed_by_path( +// path: ClusterPath, +// ) -> Result, String> { +// Ok(processor::get_processes_detailed_by_path(path).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_process_detailed_by_id(uuid: Uuid) -> Result { +// Ok(processor::get_process_detailed_by_id(uuid).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_user_by_process(uuid: Uuid) -> Result, String> { +// Ok(processor::get_user_by_process(uuid).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_process_started_at(uuid: Uuid) -> Result, String> { +// Ok(processor::get_process_started_at(uuid).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_pid_by_uuid(uuid: Uuid) -> Result { +// Ok(processor::get_pid_by_uuid(uuid).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn kill_process(uuid: Uuid) -> Result<(), String> { +// processor::kill_by_uuid(uuid).await?; +// Ok(()) +// } diff --git a/apps/onelauncher/desktop/src/api/commands/users.rs b/apps/onelauncher/desktop/src/api/commands/users.rs new file mode 100644 index 00000000..3a3504f4 --- /dev/null +++ b/apps/onelauncher/desktop/src/api/commands/users.rs @@ -0,0 +1,119 @@ +// use onelauncher::data::MinecraftCredentials; +// use onelauncher::minecraft; +// use onelauncher::store::MinecraftLogin; +// use tauri::{AppHandle, Manager}; +// use uuid::Uuid; + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_users() -> Result, String> { +// Ok(minecraft::users().await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_user(uuid: Uuid) -> Result { +// Ok(minecraft::get_user(uuid).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn remove_user(uuid: Uuid) -> Result<(), String> { +// Ok(minecraft::remove_user(uuid).await?) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn get_default_user( +// fallback: Option, +// ) -> Result, String> { +// let uuid = minecraft::get_default_user().await?; + +// if let Some(fallback) = fallback { +// if fallback && uuid.is_none() { +// return Ok(minecraft::users().await?.first().cloned()); +// } +// } + +// match uuid { +// Some(uuid) => Ok(Some(minecraft::get_user(uuid).await?)), +// None => Ok(None), +// } +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn set_default_user(uuid: Option) -> Result<(), String> { +// minecraft::set_default_user(uuid).await?; +// Ok(()) +// } + +// #[specta::specta] +// #[tauri::command] +// pub async fn auth_login(handle: AppHandle) -> Result, String> { +// let flow = minecraft::begin().await?; +// let result = spawn_webview(handle, flow).await?; + +// Ok(result) +// } + +// async fn spawn_webview( +// handle: AppHandle, +// flow: MinecraftLogin, +// ) -> Result, String> { +// let now = chrono::Utc::now(); + +// if let Some(win) = handle.get_webview_window("login") { +// win.close().map_err(|err| err.to_string())?; +// } + +// let win = tauri::WebviewWindowBuilder::new( +// &handle, +// "login", +// tauri::WebviewUrl::External( +// flow.redirect_uri +// .parse() +// .map_err(|_| anyhow::anyhow!("failed to parse auth redirect url")) +// .map_err(|err| err.to_string())?, +// ), +// ) +// .title("Log into OneLauncher") +// .always_on_top(true) +// .center() +// .build() +// .map_err(|err| err.to_string())?; + +// win.request_user_attention(Some(tauri::UserAttentionType::Critical)) +// .map_err(|err| err.to_string())?; + +// while (chrono::Utc::now() - now) < chrono::Duration::minutes(10) { +// if win.title().is_err() { +// return Ok(None); +// } + +// if win +// .url() +// .map_err(|err| err.to_string())? +// .as_str() +// .starts_with("https://login.live.com/oauth20_desktop.srf") +// { +// if let Some((_, code)) = win +// .url() +// .map_err(|err| err.to_string())? +// .query_pairs() +// .find(|x| x.0 == "code") +// { +// win.close().map_err(|err| err.to_string())?; +// let value = minecraft::finish(&code.clone(), flow).await?; + +// return Ok(Some(value)); +// } +// } + +// tokio::time::sleep(std::time::Duration::from_millis(50)).await; +// } + +// win.close().map_err(|err| err.to_string())?; + +// Ok(None) +// } diff --git a/apps/desktop/src/api/events.rs b/apps/onelauncher/desktop/src/api/events.rs similarity index 100% rename from apps/desktop/src/api/events.rs rename to apps/onelauncher/desktop/src/api/events.rs diff --git a/apps/desktop/src/api/mod.rs b/apps/onelauncher/desktop/src/api/mod.rs similarity index 100% rename from apps/desktop/src/api/mod.rs rename to apps/onelauncher/desktop/src/api/mod.rs diff --git a/apps/desktop/src/api/statics.rs b/apps/onelauncher/desktop/src/api/statics.rs similarity index 100% rename from apps/desktop/src/api/statics.rs rename to apps/onelauncher/desktop/src/api/statics.rs diff --git a/apps/desktop/src/constants.rs b/apps/onelauncher/desktop/src/constants.rs similarity index 100% rename from apps/desktop/src/constants.rs rename to apps/onelauncher/desktop/src/constants.rs diff --git a/apps/desktop/src/ext/mod.rs b/apps/onelauncher/desktop/src/ext/mod.rs similarity index 100% rename from apps/desktop/src/ext/mod.rs rename to apps/onelauncher/desktop/src/ext/mod.rs diff --git a/apps/desktop/src/ext/specta.rs b/apps/onelauncher/desktop/src/ext/specta.rs similarity index 84% rename from apps/desktop/src/ext/specta.rs rename to apps/onelauncher/desktop/src/ext/specta.rs index b481c50a..951373d5 100644 --- a/apps/desktop/src/ext/specta.rs +++ b/apps/onelauncher/desktop/src/ext/specta.rs @@ -11,7 +11,7 @@ pub fn formatter(file: &Path) -> io::Result<()> { .arg(file) .output() .map(|_| ()) - .map_err(|e| io::Error::new(io::ErrorKind::Other, e)) + .map_err(io::Error::other) } const _: specta_typescript::FormatterFn = formatter; diff --git a/apps/desktop/src/ext/updater.rs b/apps/onelauncher/desktop/src/ext/updater.rs similarity index 100% rename from apps/desktop/src/ext/updater.rs rename to apps/onelauncher/desktop/src/ext/updater.rs diff --git a/apps/desktop/src/lib.rs b/apps/onelauncher/desktop/src/lib.rs similarity index 80% rename from apps/desktop/src/lib.rs rename to apps/onelauncher/desktop/src/lib.rs index d2f5f3a4..5d13c953 100644 --- a/apps/desktop/src/lib.rs +++ b/apps/onelauncher/desktop/src/lib.rs @@ -1,9 +1,13 @@ -use onelauncher_core::{api::proxy::ProxyTauri, error::LauncherResult, store::{proxy::ProxyState, semaphore::SemaphoreStore, Core, CoreOptions, Dirs, State}}; +use onelauncher_core::api::proxy::ProxyTauri; +use onelauncher_core::error::LauncherResult; +use onelauncher_core::store::proxy::ProxyState; +use onelauncher_core::store::semaphore::SemaphoreStore; +use onelauncher_core::store::{Core, CoreOptions, Dirs, State}; use tauri::{Emitter, Manager}; pub mod api; -pub mod ext; pub mod constants; +pub mod ext; #[derive(Clone, serde::Serialize)] pub struct SingleInstancePayload { @@ -44,7 +48,7 @@ async fn initialize_tauri(builder: tauri::Builder) -> LauncherResult specta_typescript::Typescript::default() .bigint(specta_typescript::BigIntExportBehavior::BigInt) .formatter(ext::specta::formatter), - "../../packages/client/src/bindings.ts", + "../../frontend/src/bindings.ts", ) .expect("failed to export debug bindings!"); @@ -65,7 +69,7 @@ async fn initialize_tauri(builder: tauri::Builder) -> LauncherResult .invoke_handler(prebuild.invoke_handler()) .setup(move |app| { prebuild.mount_events(app.handle()); - setup_window(app.handle()); + setup_window(app.handle()).expect("failed to setup main window"); Ok(()) }); @@ -89,14 +93,20 @@ async fn initialize_state(handle: &tauri::AppHandle) -> LauncherResult<()> { pub async fn run() { initialize_core().await.expect("failed to initialize core"); - let app = initialize_tauri(tauri::Builder::default()).await.expect("failed to initialize tauri"); - initialize_state(app.handle()).await.expect("failed to initialize state"); + let app = initialize_tauri(tauri::Builder::default()) + .await + .expect("failed to initialize tauri"); + initialize_state(app.handle()) + .await + .expect("failed to initialize state"); app.run(|_, _| {}); } fn setup_window(handle: &tauri::AppHandle) -> Result<(), Box> { - let win = handle.get_webview_window("main").unwrap(); + let win = handle + .get_webview_window("main") + .ok_or_else(|| anyhow::anyhow!("no window called main was found"))?; // tokio::task::spawn(async move { // // let state = State::get().await.expect("failed to get state"); @@ -104,8 +114,7 @@ fn setup_window(handle: &tauri::AppHandle) -> Result<(), Box Result<()> { - let mut cluster = create_cluster().await?; - - // Print Packages first - print_packages(&cluster).await?; - - println!("Download the first mod, adding it to the PackageManager and sync packages"); - download_mod( - &mut cluster, - MODRINTH_PACKAGE_ONE, - MODRINTH_PACKAGE_ONE_VERSION, - true, - ) - .await?; - cluster::content::package::sync_packages_by_type(&cluster.cluster_path(), PackageType::Mod, None) - .await?; - - // Print Packages again - print_packages(&cluster).await?; - - println!("Download the second mod, NOT adding it to the PackageManager and sync packages"); - let package_path = download_mod( - &mut cluster, - MODRINTH_PACKAGE_TWO, - MODRINTH_PACKAGE_TWO_VERSION, - false, - ) - .await?; - cluster::content::package::sync_packages_by_type(&cluster.cluster_path(), PackageType::Mod, None) - .await?; - - // Print Packages again - print_packages(&cluster).await?; - - println!("Removing the second mod from the PackageManager and sync packages"); - cluster::content::package::remove_package( - &cluster.cluster_path(), - &package_path, - ) - .await?; - cluster::content::package::sync_packages_by_type(&cluster.cluster_path(), PackageType::Mod, None) - .await?; - - Ok(()) -} - -async fn create_cluster() -> Result { - if let Some(cluster) = cluster::get_by_name(CLUSTER_NAME).await? { - return Ok(cluster); - } - - let cluster_path = cluster::create::create_cluster( - CLUSTER_NAME.to_owned(), - "1.8.9".to_owned(), - Loader::Forge, - None, - None, - None, - None, - Some(true), - Some(false), - ) - .await?; - - let cluster = cluster::get(&cluster_path) - .await? - .expect("Cluster not found"); - - Ok(cluster) -} - -async fn download_mod( - cluster: &mut Cluster, - pkg: &str, - ver: &str, - add: bool, -) -> Result { - let package = Providers::Modrinth.get(pkg).await?; - - let (package_path, package) = cluster::content::package::download_package( - &package, - cluster, - None, - None, - Some(ver.to_owned()), - ) - .await?; - - if add { - cluster::content::package::add_package( - &cluster.cluster_path(), - package_path.clone(), - package, - ) - .await?; - } - - Ok(package_path) -} - -async fn print_packages(cluster: &Cluster) -> Result<()> { - let packages = - cluster::content::package::get_packages(&cluster.cluster_path(), PackageType::Mod).await?; - - println!("Packages for cluster: {:?}", cluster.cluster_path()); - for package in packages { - println!("{:?}: {:?}", package.file_name, package.meta); - } - - Ok(()) -} diff --git a/apps/testing/examples/murmur2_hash.rs b/apps/testing/examples/murmur2_hash.rs deleted file mode 100644 index 82cdfac2..00000000 --- a/apps/testing/examples/murmur2_hash.rs +++ /dev/null @@ -1,14 +0,0 @@ -use onelauncher::utils::crypto; - -const CONTENT: &str = " -this is my -text content -"; - -fn main() { - let hash = crypto::murmur2(CONTENT.as_bytes()); - - dbg!(hash); - dbg!(hash as u64); - assert_eq!(hash, 661_461_369); -} \ No newline at end of file diff --git a/apps/testing/examples/search_packages.rs b/apps/testing/examples/search_packages.rs deleted file mode 100644 index a0d6caa8..00000000 --- a/apps/testing/examples/search_packages.rs +++ /dev/null @@ -1,34 +0,0 @@ -use onelauncher::data::PackageType; -use onelauncher::package::content::Providers; -use onelauncher::{Result, State}; - -#[tokio::main] -async fn main() -> Result<()> { - let _ = State::get().await?; - - search(Providers::Modrinth).await?; - search(Providers::Curseforge).await?; - - Ok(()) -} - -async fn search(provider: Providers) -> Result<()> { - println!("Searching for packages from {}...", provider.name()); - - let results = provider - .search( - Some("Evergreen HUD".to_string()), - Some(5), - Some(0), - None, - None, - None, - Some(vec![PackageType::Mod]), - None, - ) - .await?; - - println!("{results:#?}"); - - Ok(()) -} diff --git a/apps/testing/index.html b/apps/testing/index.html deleted file mode 100644 index dd8392f2..00000000 --- a/apps/testing/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - OneLauncher Testing - - - this will test a onelauncher command from an untrusted site - this command will launch onelauncher - this command will test onelauncher url sanitization - unknown command - - diff --git a/apps/testing/package.json b/apps/testing/package.json deleted file mode 100644 index 5b17d76a..00000000 --- a/apps/testing/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@onelauncher/testing", - "version": "0.1.0-alpha.2", - "private": true, - "description": "Next-generation open source Minecraft launcher playground", - "license": "GPL-3.0-only", - "repository": { - "type": "git", - "url": "git@github.com:polyfrost/onelauncher", - "directory": "apps/testing" - }, - "bugs": "https://github.com/polyfrost/onelauncher/issues", - "sideEffects": false, - "scripts": { - "example": "cargo run --example " - } -} diff --git a/apps/testing/src/main.rs b/apps/testing/src/main.rs deleted file mode 100644 index d5466512..00000000 --- a/apps/testing/src/main.rs +++ /dev/null @@ -1,165 +0,0 @@ -#![cfg_attr( - all(not(debug_assertions), target_os = "windows"), - windows_subsystem = "windows" -)] - -use onelauncher::cluster::create::create_cluster; -use onelauncher::package::content::Providers; -use onelauncher::prelude::*; - -#[tokio::main] -async fn main() -> onelauncher::Result<()> { - let _logger = onelauncher::start_logger(); - let _state = State::get().await?; - - // modrinth().await?; - // launch_and_authenticate().await?; - authenticate_mc().await?; - - return Ok(()); -} - -/// pauline's epic gamer minecraft auth flow -/// -/// opens a browser tab in which the user sees xbox login and logs in with microsoft and gets redirected -/// to a new url. -/// -/// this new url contains the ?code=.... parameter that we need to finish authentication. -/// -/// in this testing environment we can just copy the final url from our browser and into the testing console -/// and it will parse the url and find the code and complete the authenticaiton process. -/// -/// in production/frontend, it works the same way but we get the url and code parameter automatically. -pub async fn authenticate_mc() -> onelauncher::Result { - // begins login flow, opens browser - println!("a browser will open, follow login flow"); - let login = minecraft::begin().await?; - - println!("url is {}", login.redirect_uri.as_str()); - webbrowser::open(login.redirect_uri.as_str())?; - - // after user is done with auth, paste the final code into console below this line - println!("enter flow url: "); - let mut input = String::new(); - std::io::stdin() - .read_line(&mut input) - .expect("unable to read input"); - - println!("{}", input.trim()); - - // parses the url code query param using the same logic we should use in frontend - let parsed = url::Url::parse(input.trim()).expect("idk"); - let code = if let Some((_, code)) = parsed.query_pairs().find(|x| x.0 == "code") { - let code = code.clone(); - code.to_string() - } else { - panic!() - }; - let creds = minecraft::finish(code.as_str(), login).await?; - - // mc auth flow is complete and added to state - println!("logged in {}", creds.username); - Ok(creds) -} - -pub async fn modrinth() -> onelauncher::Result<()> { - let _state = State::get().await?; - let provider = Providers::Modrinth; - let result = provider.get("oneconfig").await?; - println!("{result:#?}"); - - // let managed_version = provider - // .get_version_for_game_version(&result.id, "1.8.9") - // .await?; - // println!("{:#?}", result); - - // let name = "Example".to_string(); - // let game = "1.21".to_string(); - // let loader = Loader::Fabric; - - // let cluster_path = create_cluster( - // name.clone(), - // game, - // loader, - // None, // latest - // None, - // None, - // None, - // None, - // None, - // ) - // .await?; - - // let cluster = cluster::get(&cluster_path, None) - // .await? - // .expect("couldnt get cluster"); - // managed_version - // .files - // .first() - // .expect("no files found") - // .download_to_cluster(&cluster) - // .await?; - - Ok(()) -} - -pub async fn launch_and_authenticate() -> onelauncher::Result<()> { - let state = State::get().await?; - - if minecraft::users().await?.is_empty() { - println!("authenticating"); - authenticate_mc().await?; - } - - state.settings.write().await.max_async_fetches = 100; - state.settings.write().await.init_hooks.post = - Some("echo this should run after minecraft as a global hook".to_string()); - state.reset_fetch_semaphore().await; - - println!("clearing clusters"); - { - let c = cluster::list().await?; - for cluster in c { - cluster::remove(&cluster.cluster_path()).await?; - } - } - - let name = "examplecluster".to_string(); - let game = "1.20.4".to_string(); - let loader = Loader::Vanilla; - let loader_version = "stable".to_string(); - - let cluster = create_cluster( - name.clone(), - game, - loader, - Some(loader_version), - None, - None, - None, - None, - None, - ) - .await?; - - State::sync().await?; - - println!("running minecraft"); - let c_lock = cluster::run_default(&cluster).await?; - let uuid = c_lock.read().await.uuid; - let pid = c_lock.read().await.current_child.read().await.id(); - - println!("mc_uuid: {uuid}"); - println!("mc_pid: {pid:?}"); - - println!("proc_uuid: {:?}", processor::get_running().await?); - println!( - "proc_path: {:?}", - processor::get_running_cluster_paths().await? - ); - - let mut proc = c_lock.write().await; - processor::wait_for(&mut proc).await?; - - Ok(()) -} diff --git a/packages/distribution/macos/.gitkeep b/packages/distribution/macos/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/distribution/package.json b/packages/distribution/package.json deleted file mode 100644 index 587d55a8..00000000 --- a/packages/distribution/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@onelauncher/distribution", - "version": "0.1.0-alpha.2", - "private": true, - "description": "Distribution files for OneLauncher", - "license": "GPL-3.0-only", - "repository": { - "type": "git", - "url": "git@github.com:polyfrost/onelauncher", - "directory": "packages/distribution" - }, - "bugs": "https://github.com/polyfrost/onelauncher/issues", - "sideEffects": false, - "scripts": {}, - "dependencies": {}, - "devDependencies": {} -} diff --git a/packages/distribution/rpm/.gitkeep b/packages/distribution/rpm/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/distribution/snapcraft/.gitkeep b/packages/distribution/snapcraft/.gitkeep deleted file mode 100644 index e69de29b..00000000