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; } export interface ThemePalette { id: string; name: string; colors: Record; } 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 { return invoke("save_config", { config }); } static async loadConfig(): Promise { return invoke("load_config"); } static async getExternalPalettes(): Promise { return invoke("get_external_palettes"); } static async importTheme(): Promise { return invoke("import_theme"); } static async exportSettings(): Promise { return invoke("export_settings"); } static async importSettings(): Promise { return invoke("import_settings"); } static async getAvailableRunners(): Promise { return invoke("get_available_runners"); } static async downloadRunner(name: string, url: string): Promise { return invoke("download_runner", { name, url }); } static async checkGameInstalled(instanceId: string): Promise { return invoke("check_game_installed", { instanceId }); } static async openInstanceFolder(instanceId: string): Promise { return invoke("open_instance_folder", { instanceId }); } static async deleteInstance(instanceId: string): Promise { return invoke("delete_instance", { instanceId }); } static async cancelDownload(): Promise { return invoke("cancel_download"); } static async setupMacosRuntime(): Promise { return invoke("setup_macos_runtime"); } static async downloadAndInstall( url: string, instanceId: string, ): Promise { return invoke("download_and_install", { url, instanceId }); } static async launchGame( instanceId: string, servers: McServer[], extraArgs?: string[], ): Promise { return invoke("launch_game", { instanceId, servers, extraArgs: extraArgs ?? [] }); } static async stopGame(instanceId: string): Promise { return invoke("stop_game", { instanceId }); } static async syncDlc(instanceId: string): Promise { return invoke("sync_dlc", { instanceId }); } static async workshopInstall( instanceId: string, packageId: string, zips: Record, version: string, ): Promise { return invoke("workshop_install", { request: { instanceId, packageId, zips, version }, }); } static async workshopUninstall(instanceId: string, packageId: string): Promise { return invoke("workshop_uninstall", { instanceId, packageId }); } static async workshopListInstalled(): Promise { return invoke("workshop_list_installed"); } static onDownloadProgress(callback: (percent: number) => void) { return listen("download-progress", (event) => callback(event.payload), ); } static onRunnerDownloadProgress(callback: (percent: number) => void) { return listen("runner-download-progress", (event) => callback(event.payload), ); } static onMacosProgress(callback: (payload: MacOSSetupProgress) => void) { return listen("macos-setup-progress", (event) => callback(event.payload), ); } static async openUrl(url: string): Promise { return invoke("plugin:opener|open_url", { url }); } static async restartLauncher(): Promise { return invoke("restart_launcher"); } static async checkMacOSRuntimeInstalled(): Promise { return invoke("check_macos_runtime_installed"); } static async checkMacOSRuntimeInstalledFast(): Promise { return invoke("check_macos_runtime_installed_fast"); } static async setupMacOSRuntimeOptimized(): Promise { 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 { return invoke("save_global_skin_pck", { pckData: Array.from(pckData) }); } static async checkGameUpdate(instanceId: string, url: string): Promise { return invoke("check_game_update", { instanceId, url }); } static async pickFolder(): Promise { return invoke("pick_folder"); } static async pickFile(title: string, filters: string[]): Promise { return invoke("pick_file", { title, filters }); } static async saveFileDialog(title: string, filename: string, filters: string[]): Promise { return invoke("save_file_dialog", { title, filename, filters }); } static async writeBinaryFile(path: string, data: Uint8Array): Promise { return invoke("write_binary_file", { path, data: Array.from(data) }); } static async readBinaryFile(path: string): Promise { const data: number[] = await invoke("read_binary_file", { path }); return new Uint8Array(data); } static async downloadLogo(id: string, url: string): Promise { return invoke("download_logo", { id, url }); } static async addToSteam( instanceId: string, name: string, titleBase64: string, panoramaBase64: string ): Promise { 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 { return invoke("start_direct_proxy", { targetIp, targetPort }); } static async startRelayProxy(apiBaseUrl: string, accessToken: string, sessionId: string): Promise { return invoke("start_relay_proxy", { apiBaseUrl, accessToken, sessionId }); } static async startHostRelay(apiBaseUrl: string, accessToken: string, sessionId: string, gamePort: number): Promise { return invoke("start_host_relay", { apiBaseUrl, accessToken, sessionId, gamePort }); } static async stopProxy(sessionId: string): Promise { return invoke("stop_proxy", { sessionId }); } static async stopAllProxies(): Promise { return invoke("stop_all_proxies"); } static async joinGame( apiBaseUrl: string, accessToken: string, hostIp: string, hostPort: number, sessionId: string, instanceId: string, ): Promise { return invoke("join_game", { apiBaseUrl, accessToken, hostIp, hostPort, sessionId, instanceId }); } static async httpProxyRequest( method: string, url: string, body: string | null, headers: Record ): Promise<{ status: number; body: string }> { return invoke("http_proxy_request", { method, url, body, headers }); } static async getPlaytime(instanceId: string): Promise { return invoke("get_playtime", { instanceId }); } static async getPlaytimeDaily(instanceId: string, days: number): Promise { return invoke("get_playtime_daily", { instanceId, days }); } static async getInstancePath(instanceId: string): Promise { return invoke("get_instance_path", { instanceId }); } static async readScreenshotAsDataUrl(path: string): Promise { return invoke("read_screenshot_as_data_url", { path }); } static async backupInstance(instanceId: string): Promise { return invoke("backup_instance", { instanceId }); } static async restoreInstance(): Promise { return invoke("restore_instance"); } static async importWorld( inputPath: string, outputPath: string, ): Promise { return invoke("import_world", { inputPath, outputPath }); } }