Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions apps/oneclient/desktop/src/api/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use onelauncher_core::error::LauncherResult;
use tauri::Runtime;

use crate::oneclient::bundles::BundlesManager;
use crate::oneclient::clusters::{OnlineClusterManifest, get_data_storage_versions};

#[taurpc::procedures(path = "oneclient", export_to = "../frontend/src/bindings.gen.ts")]
pub trait OneClientApi {
Expand All @@ -18,6 +19,9 @@ pub trait OneClientApi {

#[taurpc(alias = "getBundlesFor")]
async fn get_bundles_for(cluster_id: ClusterId) -> LauncherResult<Vec<ModpackArchive>>;

#[taurpc(alias = "getVersions")]
async fn get_versions() -> LauncherResult<OnlineClusterManifest>;
}

#[taurpc::ipc_type]
Expand Down Expand Up @@ -72,4 +76,8 @@ impl OneClientApi for OneClientApiImpl {

Ok(bundles)
}

async fn get_versions(self) -> LauncherResult<OnlineClusterManifest> {
get_data_storage_versions().await
}
}
49 changes: 39 additions & 10 deletions apps/oneclient/desktop/src/oneclient/clusters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use onelauncher_core::error::LauncherResult;
use onelauncher_core::send_error;
use onelauncher_core::utils::http::fetch_json;
use reqwest::Method;
use serde::Deserialize;
use serde::{Deserialize, Serialize};

///
/// e.g.
Expand All @@ -15,44 +15,73 @@ use serde::Deserialize;
/// "clusters": [
/// {
/// "major_version": 21,
/// "name": "Tricky Trials",
/// "art": "/versions/art/Tricky_Trials.png",
/// "entries": [
/// {
/// "minor_version": 5,
/// "loader": "fabric"
/// "loader": "fabric",
/// "tags": ["PvP", "Survival"]
/// },
/// {
/// "minor_version": 5,
/// "loader": "forge"
/// "loader": "forge",
/// "tags": ["PvP", "Survival"]
/// }
/// ]
/// },
/// {
/// "major_version": 20,
/// "name": "Trails & Tales",
/// "art": "/versions/art/Trails_Tales.png",
/// "entries": [
/// {
/// "minor_version": 5,
/// "loader": "fabric"
/// "loader": "fabric",
/// "tags": ["PvP", "Survival"]
/// }
/// ]
/// }
/// ]
/// }
/// ```
#[derive(Deserialize)]
struct OnlineClusterManifest {
#[derive(specta::Type, Deserialize, Serialize)]
pub struct OnlineClusterManifest {
clusters: Vec<OnlineCluster>,
}

#[derive(Deserialize)]
struct OnlineCluster {
#[derive(specta::Type, Deserialize, Serialize)]
pub struct OnlineCluster {
major_version: u8,
name: String,
art: String,
entries: Vec<OnlineClusterEntry>,
}

#[derive(Deserialize)]
struct OnlineClusterEntry {
#[derive(specta::Type, Deserialize, Serialize)]
pub struct OnlineClusterEntry {
minor_version: u8,
loader: GameLoader,
tags: Vec<String>,
}

pub async fn get_data_storage_versions() -> LauncherResult<OnlineClusterManifest> {
let manifest = match fetch_json::<OnlineClusterManifest>(
Method::GET,
&format!("{}/versions/versions.json", crate::constants::META_URL_BASE),
None,
None,
)
.await
{
Ok(m) => m,
Err(e) => {
send_error!("failed to fetch clusters manifest: {}", e);
return Err(e);
}
};

Ok(manifest)
}

pub async fn init_clusters() -> LauncherResult<()> {
Expand Down
4 changes: 4 additions & 0 deletions apps/oneclient/frontend/src/assets/misc/missingLogo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
62 changes: 54 additions & 8 deletions apps/oneclient/frontend/src/bindings.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,50 @@ export type MojangSkin = { id: string; state: string; url: string; variant: Skin

export type MowojangProfile = { id: string; username: string }

export type OnlineCluster = { major_version: number; name: string; art: string; entries: OnlineClusterEntry[] }

export type OnlineClusterEntry = { minor_version: number; loader: GameLoader; tags: string[] }

/**
* e.g.
* ```json
* {
* "clusters": [
* {
* "major_version": 21,
* "name": "Tricky Trials",
* "art": "/versions/art/Tricky_Trials.png",
* "entries": [
* {
* "minor_version": 5,
* "loader": "fabric",
* "tags": ["PvP", "Survival"]
* },
* {
* "minor_version": 5,
* "loader": "forge",
* "tags": ["PvP", "Survival"]
* }
* ]
* },
* {
* "major_version": 20,
* "name": "Trails & Tales",
* "art": "/versions/art/Trails_Tales.png",
* "entries": [
* {
* "minor_version": 5,
* "loader": "fabric",
* "tags": ["PvP", "Survival"]
* }
* ]
* }
* ]
* }
* ```
*/
export type OnlineClusterManifest = { clusters: OnlineCluster[] }

export type PackageAuthor = { Team: { team_id: string; org_id: string | null } } | { Users: ManagedUser[] }

export type PackageCategories = { Mod: PackageModCategory[] } | { ResourcePack: PackageResourcePackCategory[] } | { Shader: PackageShaderCategory[] } | { DataPack: PackageModCategory[] } | { ModPack: PackageModPackCategory[] }
Expand Down Expand Up @@ -255,11 +299,8 @@ export type VersionType =
*/
"old_beta"

const ARGS_MAP = { 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'oneclient':'{"openDevTools":[],"getClustersGroupedByMajor":[],"getBundlesFor":["cluster_id"]}', 'core':'{"createCluster":["options"],"writeSettings":["setting"],"getPackageBody":["provider","body"],"getUser":["uuid"],"getMultiplePackages":["provider","slugs"],"removeCape":["access_token"],"openMsaLogin":[],"installModpack":["modpack","cluster_id"],"fetchLoggedInProfile":["access_token"],"getLogByName":["id","name"],"getUsers":[],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"killProcess":["pid"],"getClusters":[],"fetchMinecraftProfile":["uuid"],"getScreenshots":["id"],"getWorlds":["id"],"readSettings":[],"launchCluster":["id","uuid"],"getLoadersForVersion":["mc_version"],"getGameVersions":[],"getUsersFromAuthor":["provider","author"],"getRunningProcessesByClusterId":["cluster_id"],"changeCape":["access_token","cape_uuid"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"getClusterById":["id"],"setDefaultUser":["uuid"],"getGlobalProfile":[],"updateClusterById":["id","request"],"removeCluster":["id"],"getRunningProcesses":[],"isClusterRunning":["cluster_id"],"updateClusterProfile":["name","profile"],"removeUser":["uuid"],"getLogs":["id"],"getDefaultUser":["fallback"],"searchPackages":["provider","query"],"getProfileOrDefault":["name"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"open":["input"],"convertUsernameUUID":["username_uuid"],"createSettingsProfile":["name"],"changeSkin":["access_token","skin_url","skin_variant"],"getPackage":["provider","slug"]}', 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}' }
export type Router = { 'oneclient': { openDevTools: () => Promise<void>,
getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]> },
'core': { getClusters: () => Promise<ClusterModel[]>,
const ARGS_MAP = { 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'events':'{"ingress":["event"],"process":["event"],"message":["event"]}', 'core':'{"removeUser":["uuid"],"launchCluster":["id","uuid"],"getLogByName":["id","name"],"createSettingsProfile":["name"],"isClusterRunning":["cluster_id"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"getClusters":[],"getLogs":["id"],"getPackage":["provider","slug"],"getPackageBody":["provider","body"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"getWorlds":["id"],"killProcess":["pid"],"updateClusterProfile":["name","profile"],"readSettings":[],"getUsers":[],"getDefaultUser":["fallback"],"getGlobalProfile":[],"searchPackages":["provider","query"],"getMultiplePackages":["provider","slugs"],"removeCape":["access_token"],"removeCluster":["id"],"getRunningProcesses":[],"getLoadersForVersion":["mc_version"],"getUser":["uuid"],"open":["input"],"createCluster":["options"],"getUsersFromAuthor":["provider","author"],"convertUsernameUUID":["username_uuid"],"installModpack":["modpack","cluster_id"],"setDefaultUser":["uuid"],"getProfileOrDefault":["name"],"getClusterById":["id"],"changeSkin":["access_token","skin_url","skin_variant"],"getMods":["id"],"getGameVersions":[],"fetchLoggedInProfile":["access_token"],"changeCape":["access_token","cape_uuid"],"getRunningProcessesByClusterId":["cluster_id"],"writeSettings":["setting"],"openMsaLogin":[],"updateClusterById":["id","request"],"fetchMinecraftProfile":["uuid"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getScreenshots":["id"]}', 'oneclient':'{"getBundlesFor":["cluster_id"],"getVersions":[],"getClustersGroupedByMajor":[],"openDevTools":[]}' }
export type Router = { 'core': { getClusters: () => Promise<ClusterModel[]>,
getClusterById: (id: number) => Promise<ClusterModel | null>,
removeCluster: (id: number) => Promise<null>,
createCluster: (options: CreateCluster) => Promise<ClusterModel>,
Expand All @@ -269,6 +310,7 @@ getScreenshots: (id: number) => Promise<string[]>,
getWorlds: (id: number) => Promise<string[]>,
getLogs: (id: number) => Promise<string[]>,
getLogByName: (id: number, name: string) => Promise<string | null>,
getMods: (id: number) => Promise<string[]>,
getRunningProcesses: () => Promise<Process[]>,
getRunningProcessesByClusterId: (clusterId: number) => Promise<Process[]>,
isClusterRunning: (clusterId: number) => Promise<boolean>,
Expand Down Expand Up @@ -303,11 +345,15 @@ changeCape: (accessToken: string, capeUuid: string) => Promise<MojangFullPlayerP
removeCape: (accessToken: string) => Promise<MojangFullPlayerProfile>,
convertUsernameUUID: (usernameUuid: string) => Promise<MowojangProfile>,
open: (input: string) => Promise<null> },
'folders': { fromCluster: (folderName: string) => Promise<string>,
openCluster: (folderName: string) => Promise<null> },
'oneclient': { openDevTools: () => Promise<void>,
getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]>,
getVersions: () => Promise<OnlineClusterManifest> },
'events': { ingress: (event: IngressPayload) => Promise<void>,
message: (event: MessagePayload) => Promise<void>,
process: (event: ProcessPayload) => Promise<void> } };
process: (event: ProcessPayload) => Promise<void> },
'folders': { fromCluster: (folderName: string) => Promise<string>,
openCluster: (folderName: string) => Promise<null> } };


export type { InferCommandOutput }
Expand Down
Loading
Loading