LCE-Emerald-Launcher/src/services/TauriService.ts

340 lines
9 KiB
TypeScript

import { invoke } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";
export interface McServer {
name: string;
ip: string;
port: number;
}
export interface SkinLibraryItem {
id: string;
name: string;
skinBase64: string;
}
export interface CustomEdition {
id: string;
name: string;
desc: string;
url: string;
path?: string;
category?: string[];
logo?: string;
}
export interface AppConfig {
username: string;
linuxRunner?: string;
skinBase64?: string;
skinLibrary?: SkinLibraryItem[];
themeStyleId?: string;
themePaletteId?: string;
appleSiliconPerformanceBoost?: boolean;
customEditions?: CustomEdition[];
profile?: string;
animationsEnabled?: boolean;
vfxEnabled?: boolean;
rpcEnabled?: boolean;
musicVol?: number;
sfxVol?: number;
legacyMode?: boolean;
mangohudEnabled?: boolean;
savedServers?: McServer[];
extraLaunchArgs?: string[];
launchPrefix?: string;
launchEnvVars?: Record<string, string>;
}
export interface ThemePalette {
id: string;
name: string;
colors: Record<string, string>;
}
export interface Runner {
id: string;
name: string;
path: string;
type: "wine" | "proton";
}
export interface MacOSSetupProgress {
stage: string;
message: string;
percent?: number;
}
export interface InstalledWorkshopPackage {
instanceId: string;
packageId: string;
version: string;
}
export interface PlaytimeResponse {
totalSeconds: number;
weekSeconds: number;
daySeconds: number;
}
export interface PlaytimeDayEntry {
label: string;
seconds: number;
}
export class TauriService {
static async saveConfig(config: AppConfig): Promise<void> {
return invoke("save_config", { config });
}
static async loadConfig(): Promise<AppConfig> {
return invoke("load_config");
}
static async getExternalPalettes(): Promise<ThemePalette[]> {
return invoke("get_external_palettes");
}
static async importTheme(): Promise<string> {
return invoke("import_theme");
}
static async exportSettings(): Promise<void> {
return invoke("export_settings");
}
static async importSettings(): Promise<string> {
return invoke("import_settings");
}
static async getAvailableRunners(): Promise<Runner[]> {
return invoke("get_available_runners");
}
static async downloadRunner(name: string, url: string): Promise<string> {
return invoke("download_runner", { name, url });
}
static async checkGameInstalled(instanceId: string): Promise<boolean> {
return invoke("check_game_installed", { instanceId });
}
static async openInstanceFolder(instanceId: string): Promise<void> {
return invoke("open_instance_folder", { instanceId });
}
static async deleteInstance(instanceId: string): Promise<void> {
return invoke("delete_instance", { instanceId });
}
static async cancelDownload(): Promise<void> {
return invoke("cancel_download");
}
static async setupMacosRuntime(): Promise<void> {
return invoke("setup_macos_runtime");
}
static async downloadAndInstall(
url: string,
instanceId: string,
): Promise<string> {
return invoke("download_and_install", { url, instanceId });
}
static async launchGame(
instanceId: string,
servers: McServer[],
extraArgs?: string[],
): Promise<void> {
return invoke("launch_game", { instanceId, servers, extraArgs: extraArgs ?? [] });
}
static async stopGame(instanceId: string): Promise<void> {
return invoke("stop_game", { instanceId });
}
static async syncDlc(instanceId: string): Promise<void> {
return invoke("sync_dlc", { instanceId });
}
static async workshopInstall(
instanceId: string,
packageId: string,
zips: Record<string, string>,
version: string,
): Promise<void> {
return invoke("workshop_install", {
request: { instanceId, packageId, zips, version },
});
}
static async workshopUninstall(instanceId: string, packageId: string): Promise<void> {
return invoke("workshop_uninstall", { instanceId, packageId });
}
static async workshopListInstalled(): Promise<InstalledWorkshopPackage[]> {
return invoke("workshop_list_installed");
}
static onDownloadProgress(callback: (percent: number) => void) {
return listen<number>("download-progress", (event) =>
callback(event.payload),
);
}
static onRunnerDownloadProgress(callback: (percent: number) => void) {
return listen<number>("runner-download-progress", (event) =>
callback(event.payload),
);
}
static onMacosProgress(callback: (payload: MacOSSetupProgress) => void) {
return listen<MacOSSetupProgress>("macos-setup-progress", (event) =>
callback(event.payload),
);
}
static async openUrl(url: string): Promise<void> {
return invoke("plugin:opener|open_url", { url });
}
static async restartLauncher(): Promise<void> {
return invoke("restart_launcher");
}
static async checkMacOSRuntimeInstalled(): Promise<boolean> {
return invoke("check_macos_runtime_installed");
}
static async checkMacOSRuntimeInstalledFast(): Promise<boolean> {
return invoke("check_macos_runtime_installed_fast");
}
static async setupMacOSRuntimeOptimized(): Promise<void> {
return invoke("setup_macos_runtime_optimized");
}
static async fetchSkin(username: string): Promise<[string, string]> {
return invoke("fetch_skin", { username });
}
static async saveGlobalSkinPck(pckData: Uint8Array): Promise<void> {
return invoke("save_global_skin_pck", { pckData: Array.from(pckData) });
}
static async checkGameUpdate(instanceId: string, url: string): Promise<boolean> {
return invoke("check_game_update", { instanceId, url });
}
static async pickFolder(): Promise<string> {
return invoke("pick_folder");
}
static async pickFile(title: string, filters: string[]): Promise<string> {
return invoke("pick_file", { title, filters });
}
static async saveFileDialog(title: string, filename: string, filters: string[]): Promise<string> {
return invoke("save_file_dialog", { title, filename, filters });
}
static async writeBinaryFile(path: string, data: Uint8Array): Promise<void> {
return invoke("write_binary_file", { path, data: Array.from(data) });
}
static async readBinaryFile(path: string): Promise<Uint8Array> {
const data: number[] = await invoke("read_binary_file", { path });
return new Uint8Array(data);
}
static async downloadLogo(id: string, url: string): Promise<string> {
return invoke("download_logo", { id, url });
}
static async addToSteam(
instanceId: string,
name: string,
titleBase64: string,
panoramaBase64: string
): Promise<void> {
return invoke("add_to_steam", { instanceId, name, titleBase64, panoramaBase64 });
}
static async stunDiscover(): Promise<{ ip: string; port: number }> {
return invoke("stun_discover");
}
static async startDirectProxy(targetIp: string, targetPort: number): Promise<number> {
return invoke("start_direct_proxy", { targetIp, targetPort });
}
static async startRelayProxy(apiBaseUrl: string, accessToken: string, sessionId: string): Promise<number> {
return invoke("start_relay_proxy", { apiBaseUrl, accessToken, sessionId });
}
static async startHostRelay(apiBaseUrl: string, accessToken: string, sessionId: string, gamePort: number): Promise<void> {
return invoke("start_host_relay", { apiBaseUrl, accessToken, sessionId, gamePort });
}
static async stopProxy(sessionId: string): Promise<void> {
return invoke("stop_proxy", { sessionId });
}
static async stopAllProxies(): Promise<void> {
return invoke("stop_all_proxies");
}
static async joinGame(
apiBaseUrl: string,
accessToken: string,
hostIp: string,
hostPort: number,
sessionId: string,
instanceId: string,
): Promise<void> {
return invoke("join_game", { apiBaseUrl, accessToken, hostIp, hostPort, sessionId, instanceId });
}
static async httpProxyRequest(
method: string,
url: string,
body: string | null,
headers: Record<string, string>
): Promise<{ status: number; body: string }> {
return invoke("http_proxy_request", { method, url, body, headers });
}
static async getPlaytime(instanceId: string): Promise<PlaytimeResponse> {
return invoke("get_playtime", { instanceId });
}
static async getPlaytimeDaily(instanceId: string, days: number): Promise<PlaytimeDayEntry[]> {
return invoke("get_playtime_daily", { instanceId, days });
}
static async getInstancePath(instanceId: string): Promise<string> {
return invoke("get_instance_path", { instanceId });
}
static async readScreenshotAsDataUrl(path: string): Promise<string> {
return invoke("read_screenshot_as_data_url", { path });
}
static async backupInstance(instanceId: string): Promise<void> {
return invoke("backup_instance", { instanceId });
}
static async restoreInstance(): Promise<string> {
return invoke("restore_instance");
}
static async importWorld(
inputPath: string,
outputPath: string,
): Promise<string> {
return invoke("import_world", { inputPath, outputPath });
}
}