Merge pull request #716 from Zagrios/chore/reimplement-login-with-meta

[chore] reimplement login with meta
This commit is contained in:
MathieuG-P
2024-12-26 22:12:30 +01:00
committed by GitHub
18 changed files with 187 additions and 75 deletions
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "Unmöglich, das für den Download erforderliche Manifest zu erhalten.",
"VERIFY_INTEGRITY_FAILED": "Beim Überprüfen der Dateien ist ein Fehler aufgetreten.",
"SOME_FILES_FAILED_TO_DOWNLOAD": "Einige Dateien konnten nicht heruntergeladen werden.",
"OCULUS_LOGIN_TIMED_OUT": "Es hat zu lange gedauert, das Anmelde-Token abzurufen.",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Das Meta-Anmeldefenster wurde geschlossen.",
"META_LOGIN_TIMED_OUT": "Es hat zu lange gedauert, das Anmelde-Token abzurufen.",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "Das Meta-Anmeldefenster wurde geschlossen.",
"NO_META_AUTH_TOKEN": "Unmöglich, das für den Download erforderliche Meta-Anmelde-Token zu erhalten.",
"UNKNOWN_ERROR": "Ein unbekannter Fehler ist aufgetreten."
}
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "Unable to obtain the manifest required for download.",
"VERIFY_INTEGRITY_FAILED": "An error occurred during file verification.",
"SOME_FILES_FAILED_TO_DOWNLOAD": "Some files failed to download.",
"OCULUS_LOGIN_TIMED_OUT": "The login token took too long to retrieve.",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "The Meta login window was closed.",
"META_LOGIN_TIMED_OUT": "The login token took too long to retrieve.",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "The Meta login window was closed.",
"NO_META_AUTH_TOKEN": "Unable to retrieve the Meta login token required for download.",
"UNKNOWN_ERROR": "An unknown error occurred."
}
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "Imposible obtener el manifiesto necesario para la descarga.",
"VERIFY_INTEGRITY_FAILED": "Se produjo un error durante la verificación de archivos.",
"SOME_FILES_FAILED_TO_DOWNLOAD": "Algunos archivos no pudieron ser descargados.",
"OCULUS_LOGIN_TIMED_OUT": "El token de inicio de sesión tardó demasiado en recuperarse.",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "La ventana de inicio de sesión de Meta fue cerrada.",
"META_LOGIN_TIMED_OUT": "El token de inicio de sesión tardó demasiado en recuperarse.",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "La ventana de inicio de sesión de Meta fue cerrada.",
"NO_META_AUTH_TOKEN": "Imposible recuperar el token de inicio de sesión de Meta necesario para la descarga.",
"UNKNOWN_ERROR": "Se produjo un error desconocido."
}
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "Impossible d'obtenir le manifest nécessaire au téléchargement.",
"VERIFY_INTEGRITY_FAILED": "Une erreur c'est produite lors de la vérification des fichiers.",
"SOME_FILES_FAILED_TO_DOWNLOAD": "Certains fichiers n'ont pas pu être téléchargés.",
"OCULUS_LOGIN_TIMED_OUT": "Le Token de connexion à mis trop de temps à être récupéré.",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "La fenêtre de connexion à Meta a été fermée.",
"META_LOGIN_TIMED_OUT": "Le Token de connexion à mis trop de temps à être récupéré.",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "La fenêtre de connexion à Meta a été fermée.",
"NO_META_AUTH_TOKEN": "Impossible de récupérer le token de connexion à Meta nécessaire au téléchargement.",
"UNKNOWN_ERROR": "Une erreur inconnue s'est produite."
}
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "ダウンロードに必要なマニフェストを取得できません。",
"VERIFY_INTEGRITY_FAILED": "ファイルの検証中にエラーが発生しました。",
"SOME_FILES_FAILED_TO_DOWNLOAD": "一部のファイルのダウンロードに失敗しました。",
"OCULUS_LOGIN_TIMED_OUT": "ログイントークンの取得に時間がかかりすぎました。",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "メタ・ログイン・ウィンドウが閉じられた。",
"META_LOGIN_TIMED_OUT": "ログイントークンの取得に時間がかかりすぎました。",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "メタ・ログイン・ウィンドウが閉じられた。",
"NO_META_AUTH_TOKEN": "ダウンロードに必要な Meta ログイン トークンを取得できません。",
"UNKNOWN_ERROR": "不明なエラーが発生しました。"
}
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "다운로드에 필요한 매니페스트를 가져올 수 없습니다.",
"VERIFY_INTEGRITY_FAILED": "파일 검증 중 오류가 발생했습니다.",
"SOME_FILES_FAILED_TO_DOWNLOAD": "일부 파일을 다운로드하지 못했습니다.",
"OCULUS_LOGIN_TIMED_OUT": "로그인 토큰을 얻는 데 시간이 너무 오래 걸렸습니다.",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 로그인 창이 닫혔습니다.",
"META_LOGIN_TIMED_OUT": "로그인 토큰을 얻는 데 시간이 너무 오래 걸렸습니다.",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 로그인 창이 닫혔습니다.",
"NO_META_AUTH_TOKEN": "다운로드에 필요한 Meta 로그인 토큰을 얻을 수 없습니다.",
"UNKNOWN_ERROR": "알 수 없는 오류가 발생했습니다."
}
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "Невозможно получить манифест, необходимый для загрузки.",
"VERIFY_INTEGRITY_FAILED": "При проверке файлов произошла ошибка.",
"SOME_FILES_FAILED_TO_DOWNLOAD": "Некоторые файлы не удалось загрузить.",
"OCULUS_LOGIN_TIMED_OUT": "Получение токена входа заняло слишком много времени.",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Окно входа в Meta было закрыто.",
"META_LOGIN_TIMED_OUT": "Получение токена входа заняло слишком много времени.",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "Окно входа в Meta было закрыто.",
"NO_META_AUTH_TOKEN": "Невозможно получить токен входа в Meta, необходимый для загрузки.",
"UNKNOWN_ERROR": "Произошла неизвестная ошибка."
}
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "無法獲取下載所需的清單。",
"VERIFY_INTEGRITY_FAILED": "文件驗證過程中發生錯誤。",
"SOME_FILES_FAILED_TO_DOWNLOAD": "一些文件下載失敗。",
"OCULUS_LOGIN_TIMED_OUT": "獲取登錄令牌用時過長。",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 登錄窗口被關閉。",
"META_LOGIN_TIMED_OUT": "獲取登錄令牌用時過長。",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 登錄窗口被關閉。",
"NO_META_AUTH_TOKEN": "無法獲取下載所需的 Meta 登錄令牌。",
"UNKNOWN_ERROR": "發生未知錯誤。"
}
+2 -2
View File
@@ -364,8 +364,8 @@
"UNABLE_TO_GET_MANIFEST": "无法获取下载所需的清单。",
"VERIFY_INTEGRITY_FAILED": "文件验证过程中发生错误。",
"SOME_FILES_FAILED_TO_DOWNLOAD": "一些文件下载失败。",
"OCULUS_LOGIN_TIMED_OUT": "获取登录令牌用时过长。",
"OCULUS_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 登录窗口被关闭。",
"META_LOGIN_TIMED_OUT": "获取登录令牌用时过长。",
"META_LOGIN_WINDOW_CLOSED_BY_USER": "Meta 登录窗口被关闭。",
"NO_META_AUTH_TOKEN": "无法获取下载所需的 Meta 登录令牌。",
"UNKNOWN_ERROR": "发生未知错误。"
}
@@ -1,7 +1,7 @@
import { BsOculusDownloaderService } from "../../services/bs-version-download/bs-oculus-downloader.service";
import { BsSteamDownloaderService } from "../../services/bs-version-download/bs-steam-downloader.service";
import { IpcService } from "../../services/ipc.service";
import { of } from "rxjs";
import { from, of } from "rxjs";
import { BSLocalVersionService } from "../../services/bs-local-version.service";
const ipc = IpcService.getInstance();
@@ -42,14 +42,29 @@ ipc.on("send-input-bs-download", (args, reply) => {
// #region Oculus
ipc.on("bs-oculus-download", async (args, reply) => {
ipc.on("bs-oculus-download", (args, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(oculusDownloader.downloadVersion(args));
});
ipc.on("bs-oculus-stop-download", async (_, reply) => {
ipc.on("bs-oculus-stop-download", (_, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(of(oculusDownloader.stopDownload()));
});
ipc.on("login-with-meta", (stay, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(from(oculusDownloader.getUserTokenFromMetaAuth(stay)));
});
ipc.on("delete-meta-session", (_, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(from(oculusDownloader.clearAuthToken()));
});
ipc.on("meta-session-exists", (_, reply) => {
const oculusDownloader = BsOculusDownloaderService.getInstance();
reply(from(oculusDownloader.metaSessionExists()));
});
// #endregion
+8
View File
@@ -264,3 +264,11 @@ function deleteOlestLogs(): void{
}
});
}
export function addFilterStringLog(filter: string): void {
filterStrings.add(filter);
}
export function addFilterPatternLog(filter: RegExp): void {
filterPatterns.add(filter);
}
@@ -8,6 +8,12 @@ import path from "path";
import { DownloadInfo } from "./bs-steam-downloader.service";
import { BsStore } from "../../../shared/models/bs-store.enum";
import { isOculusTokenValid } from "../../../shared/helpers/oculus.helpers";
import { CustomError } from "shared/models/exceptions/custom-error.class";
import { minToMs } from "shared/helpers/time.helpers";
import { session } from "electron";
import { WindowManagerService } from "../window-manager.service";
import { addFilterStringLog } from "../../main";
import { MetaAuthErrorCodes } from "shared/models/bs-version-download/oculus-download.model";
export class BsOculusDownloaderService {
@@ -23,13 +29,63 @@ export class BsOculusDownloaderService {
private readonly oculusDownloader: OculusDownloader;
private readonly versions: BSLocalVersionService;
private readonly windows: WindowManagerService;
private constructor() {
this.versions = BSLocalVersionService.getInstance();
this.windows = WindowManagerService.getInstance();
this.oculusDownloader = new OculusDownloader();
}
public async getUserTokenFromMetaAuth(keepToken: boolean): Promise<string>{
const loginUrl = "https://secure.oculus.com";
const redirectUrl = `${loginUrl}/my/profile`;
const window = await this.windows.openWindow(loginUrl, { frame: true, width: 650, height: 800 });
let timout: NodeJS.Timeout;
return new Promise<string>((resolve, reject) => {
timout = setTimeout(() => {
reject(new CustomError("Trying to get Oculus user token timed out", MetaAuthErrorCodes.META_LOGIN_TIMED_OUT));
window.close();
}, minToMs(10));
const tryExtractToken = async () => {
log.info("Meta auth window navigated to", new URL(window.webContents.getURL()).origin + new URL(window.webContents.getURL()).pathname); // Dot not log full url for privacy reasons
if(!window.webContents.getURL()?.startsWith(redirectUrl)){ return; }
const token = (await window.webContents.session.cookies.get({ name: "oc_ac_at" })).at(0)?.value;
if(!isOculusTokenValid(token, log.info)){
return;
}
addFilterStringLog(token);
resolve(token);
}
window.webContents.on("did-stop-loading", tryExtractToken);
window.webContents.on("did-navigate", tryExtractToken);
window.webContents.on("did-navigate-in-page", tryExtractToken);
window.on("closed", () => {
reject(new CustomError("Oculus login window closed by user", MetaAuthErrorCodes.META_LOGIN_WINDOW_CLOSED_BY_USER));
});
}).finally(() => {
clearTimeout(timout);
if(!keepToken){
this.clearAuthToken();
}
if(!window.isDestroyed() && window.isClosable()){
window.close();
}
});
}
private async createDownloadVersion(version: BSVersion): Promise<{version: BSVersion, dest: string}>{
const dest = await ensurePathNotAlreadyExist(await this.versions.getVersionPath(version));
return {
@@ -46,7 +102,7 @@ export class BsOculusDownloaderService {
this.oculusDownloader.stopDownload();
}
public downloadVersion(downloadInfo: DownloadInfo): Observable<Progression<BSVersion>>{
public downloadVersion(downloadInfo: OculusDownloadInfo): Observable<Progression<BSVersion>>{
let downloadVersion: BSVersion
@@ -69,9 +125,16 @@ export class BsOculusDownloaderService {
);
}
public clearAuthToken(): Promise<void>{
return session.defaultSession.clearStorageData({ storages: ["cookies"], origin: ".oculus.com" })
}
public metaSessionExists(): Promise<boolean>{
return session.defaultSession.cookies.get({ domain: ".oculus.com" }).then(cookies => cookies.length > 0);
}
}
export interface OculusDownloadInfo {
version: BSVersion;
stay?: boolean;
export interface OculusDownloadInfo extends DownloadInfo {
token: string;
}
@@ -147,7 +147,6 @@ export interface DownloadInfo {
bsVersion: BSVersion;
isVerification?: boolean;
stay?: boolean;
token?: string;
}
export interface DownloadSteamInfo extends DownloadInfo {
@@ -1,25 +1,52 @@
import { ModalComponent, ModalExitCode } from "../../../../services/modale.service";
import { useState } from "react";
import { ModalComponent, ModalExitCode, ModalService } from "../../../../services/modale.service";
import { MouseEventHandler, useState } from "react";
import { BsmButton } from "renderer/components/shared/bsm-button.component";
import { useTranslation } from "renderer/hooks/use-translation.hook";
import { useTranslationV2 } from "renderer/hooks/use-translation.hook";
import { MetaIcon } from "renderer/components/svgs/icons/meta-icon.component";
import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component";
import Tippy from "@tippyjs/react";
import { useService } from "renderer/hooks/use-service.hook";
import { IpcService } from "renderer/services/ipc.service";
import { lastValueFrom } from "rxjs";
import { EnterMetaTokenModal } from "./enter-meta-token-modal.component";
import { CustomError } from "shared/models/exceptions/custom-error.class";
import { MetaAuthErrorCodes } from "shared/models/bs-version-download/oculus-download.model";
import { NotificationService } from "renderer/services/notification.service";
type ReturnType = { method: MetaAuthMethod.META, stay: boolean } | { method: MetaAuthMethod.MANUAL };
export const LoginToMetaModal: ModalComponent<string> = ({ resolver }) => {
export const LoginToMetaModal: ModalComponent<ReturnType> = ({ resolver }) => {
const { text: t } = useTranslationV2();
const t = useTranslation();
const ipc = useService(IpcService);
const modal = useService(ModalService);
const notifications = useService(NotificationService);
const [stay, setStay] = useState(false);
const [stay, setStay] = useState(true);
const [authWindowOpen, setAuthWindowOpen] = useState(false);
const submit = () => {
resolver({ exitCode: ModalExitCode.COMPLETED, data: { method: MetaAuthMethod.META, stay } });
};
const handleLoginWithMeta = () => {
setAuthWindowOpen(() => true);
lastValueFrom(ipc.sendV2("login-with-meta", stay)).then(token => {
resolver({ exitCode: ModalExitCode.COMPLETED, data: token });
}).catch((e: CustomError) => {
if(e.code === MetaAuthErrorCodes.META_LOGIN_WINDOW_CLOSED_BY_USER){
return;
}
const enterTokenManually = () => {
resolver({ exitCode: ModalExitCode.COMPLETED, data: { method: MetaAuthMethod.MANUAL } });
if(e.code){
notifications.notifyError({title: "notifications.types.error", desc: `notifications.bs-download.oculus-download.errors.msg.${e.code}`});
}
resolver({ exitCode: ModalExitCode.CANCELED });
}).finally(() => {
setAuthWindowOpen(() => false);
})
}
const handleEnterTokenManually: MouseEventHandler<HTMLButtonElement> = async (e) => {
e.preventDefault();
const res = await modal.openModal(EnterMetaTokenModal);
resolver(res);
}
return (
@@ -38,17 +65,12 @@ export const LoginToMetaModal: ModalComponent<ReturnType> = ({ resolver }) => {
<span>{t("modals.connect-to-meta.stay")}</span>
</div>
<BsmButton className="rounded-md flex justify-center items-center transition-all h-10 w-full" typeColor="primary" text="modals.connect-to-meta.connect-to-meta" withBar={false} onClick={submit}/>
<BsmButton className="rounded-md flex justify-center items-center transition-all h-10 w-full" typeColor="primary" text="modals.connect-to-meta.connect-to-meta" withBar={false} onClick={handleLoginWithMeta} disabled={authWindowOpen}/>
<Tippy className="!bg-neutral-900" arrow={false} content={t("modals.connect-to-meta.body.enter-token-manually-tooltip")} >
<p className="text-sm italic underline text-center -translate-y-1 leading-3 cursor-pointer" onClick={enterTokenManually}>{t("modals.connect-to-meta.body.enter-token-manually")}</p>
<button className="text-sm italic underline text-center -translate-y-1 leading-3 cursor-pointer" onClick={handleEnterTokenManually}>{t("modals.connect-to-meta.body.enter-token-manually")}</button>
</Tippy>
</form>
);
};
export enum MetaAuthMethod {
MANUAL = "manual",
META = "meta"
}
@@ -46,6 +46,7 @@ import { StaticConfigurationService } from "renderer/services/static-configurati
import { tryit } from "shared/helpers/error.helpers";
import { InstallationLocationService } from "renderer/services/installation-location.service";
import { AutoUpdaterService } from "renderer/services/auto-updater.service";
import { OculusDownloaderService } from "renderer/services/bs-version-download/oculus-downloader.service";
export function SettingsPage() {
@@ -55,6 +56,7 @@ export function SettingsPage() {
const modalService = useService(ModalService);
const bsDownloader = useService(BsDownloaderService);
const steamDownloader = useService(SteamDownloaderService);
const oculusDownloader = useService(OculusDownloaderService);
const progressBarService = useService(ProgressBarService);
const notificationService = useService(NotificationService);
const i18nService = useService(I18nService);
@@ -121,16 +123,17 @@ export function SettingsPage() {
});
};
const loadDownloadersSession = () => {
setHasDownloaderSession(steamDownloader.sessionExist());
const loadDownloadersSession = async () => {
setHasDownloaderSession(steamDownloader.sessionExist() || await oculusDownloader.metaSessionExists());
}
const clearDownloadersSession = () => {
const clearDownloadersSession = async () => {
if (!hasDownloaderSession) {
return;
}
steamDownloader.deleteSteamSession();
await oculusDownloader.deleteMetaSession()
notificationService.notifyInfo({
title: "pages.settings.steam-and-oculus.logout-success",
});
@@ -8,10 +8,9 @@ import { NotificationService } from "../notification.service";
import { ModalExitCode, ModalService } from "../modale.service";
import { DownloaderServiceInterface } from "./bs-store-downloader.interface";
import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service";
import { DownloadInfo } from "main/services/bs-version-download/bs-steam-downloader.service";
import { MetaAuthErrorCodes, OculusDownloaderErrorCodes } from "shared/models/bs-version-download/oculus-download.model";
import { EnterMetaTokenModal } from "renderer/components/modal/modal-types/bs-downgrade/enter-meta-token-modal.component";
import { addFilterStringLog } from "renderer";
import { LoginToMetaModal } from "renderer/components/modal/modal-types/bs-downgrade/login-to-meta-modal.component";
import { OculusDownloadInfo } from "main/services/bs-version-download/bs-oculus-downloader.service";
export class OculusDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{
@@ -69,7 +68,7 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme
);
}
private startDownloadBsVersion(downloadInfo: DownloadInfo): Observable<Progression<BSVersion>>{
private startDownloadBsVersion(downloadInfo: OculusDownloadInfo): Observable<Progression<BSVersion>>{
const ignoreCode = [MetaAuthErrorCodes.META_LOGIN_WINDOW_CLOSED_BY_USER, OculusDownloaderErrorCodes.DOWNLOAD_CANCELLED];
return this.handleDownload(
this.ipc.sendV2("bs-oculus-download", downloadInfo ),
@@ -77,25 +76,16 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme
);
}
private async doDownloadBsVersion(bsVersion: BSVersion, isVerification: boolean): Promise<BSVersion> {
private async doDownloadBsVersion(bsVersion: BSVersion, isVerification: boolean): Promise<BSVersion|undefined> {
const autoDownloadFailed = false;
const {exitCode, data: token} = await this.modals.openModal(LoginToMetaModal)
return (async () => {
if(exitCode !== ModalExitCode.COMPLETED){
return undefined
}
const tokenRes = await this.modals.openModal(EnterMetaTokenModal);
if(tokenRes.exitCode !== ModalExitCode.COMPLETED){
return false;
}
addFilterStringLog(tokenRes.data);
return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token: tokenRes.data })).then(() => true);
})().then(res => {
if(autoDownloadFailed || !res){
return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token })).then(() => true).then(res => {
if(!res){
return bsVersion;
}
@@ -121,4 +111,12 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme
return lastValueFrom(this.ipc.sendV2("bs-oculus-stop-download"));
}
public deleteMetaSession(): Promise<void>{
return lastValueFrom(this.ipc.sendV2("delete-meta-session"));
}
public metaSessionExists(): Promise<boolean>{
return lastValueFrom(this.ipc.sendV2("meta-session-exists"));
}
}
+3 -3
View File
@@ -12,8 +12,8 @@ export function isOculusTokenValid(token: string, logger?: (...args: unknown[])
logger?.("Token contains %. Token most likely comes from an uri and won't work");
return false;
}
if(!token.startsWith("FRL")){
logger?.("Tokens must start with 'FRL'.");
if(!token.startsWith("FRL") && !token.startsWith("OC") ){
logger?.("Tokens must start with 'FRL' or 'OC'.");
return false;
}
if(token.includes("|")){
@@ -33,4 +33,4 @@ export function isOculusTokenValid(token: string, logger?: (...args: unknown[])
return true;
}
}
+6 -2
View File
@@ -6,7 +6,7 @@ import { BsvMapDetail, SongDetails } from "shared/models/maps";
import { BsmLocalMap, BsmLocalMapsProgress, DeleteMapsProgress } from "shared/models/maps/bsm-local-map.interface";
import { BsvPlaylist, BsvPlaylistPage, PlaylistSearchParams, SearchParams } from "../maps/beat-saver.model";
import { ImportVersionOptions } from "main/services/bs-local-version.service";
import { DownloadInfo, DownloadSteamInfo } from "main/services/bs-version-download/bs-steam-downloader.service";
import { DownloadSteamInfo } from "main/services/bs-version-download/bs-steam-downloader.service";
import { DepotDownloaderEvent } from "../bs-version-download/depot-downloader.model";
import { MSGetQuery, MSModel, MSModelType } from "../models/model-saber.model";
import { ModelDownload } from "renderer/services/models-management/models-downloader.service";
@@ -21,6 +21,7 @@ import { AppWindow } from "../window-manager/app-window.model";
import { LocalBPList, LocalBPListsDetails } from "../playlists/local-playlist.models";
import { StaticConfigGetIpcRequestResponse, StaticConfigKeys, StaticConfigSetIpcRequest } from "main/services/static-configuration.service";
import { ExternalMod } from "../mods/mod.interface";
import { OculusDownloadInfo } from "main/services/bs-version-download/bs-oculus-downloader.service";
export type IpcReplier<T> = (data: Observable<T>) => void;
@@ -33,8 +34,11 @@ export interface IpcChannelMapping {
"download-bs-version-qr": { request: DownloadSteamInfo, response: DepotDownloaderEvent};
"stop-download-bs-version": { request: void, response: void};
"send-input-bs-download": { request: string, response: boolean};
"bs-oculus-download": { request: DownloadInfo, response: Progression<BSVersion>};
"bs-oculus-download": { request: OculusDownloadInfo, response: Progression<BSVersion>};
"bs-oculus-stop-download": { request: void, response: void};
"login-with-meta": { request: boolean, response: string };
"delete-meta-session": { request: void, response: void };
"meta-session-exists": { request: void, response: boolean };
/* ** beat-saver-ipcs ** */
"bsv-search-map": {request: SearchParams, response: BsvMapDetail[]};