Files
genshin-assistant/src/services/assistantBridge.ts
T
2026-07-07 22:02:24 +02:00

109 lines
4.8 KiB
TypeScript

import type {
CaptureOptions,
CaptureResult,
CaptureSourceInfo,
ArtifactStoreLoadResult,
ArtifactStoreSaveResult,
BooleanResult,
ReviewSampleListResult,
ReviewSamplePayload,
SaveResultWithPath,
FocusGenshinResult,
LoadScannerLearningRulesResult,
ScrollResult,
RuntimeInfo,
SaveScannerLearningRulesResult,
SaveSnapshotResult,
GoodDatabase,
GoodImportFileResult,
ScannerCommand,
ScannerStatusPayload,
ScannerLearningRulePayload,
KeyPressResult,
} from "../types/global";
import type { AppSnapshot } from "../types/domain";
import type { StoredArtifactRecord } from "../types/storage";
import type { AutomationGuard, ClickResult } from "../types/global";
export interface AssistantBridge {
isAvailable: boolean;
canExportGood: boolean;
canShowOverlay: boolean;
canAutoScan: boolean;
canReviewSamples: boolean;
loadSnapshot: () => Promise<AppSnapshot | null>;
saveSnapshot: (snapshot: AppSnapshot) => Promise<SaveSnapshotResult>;
runMockScan: () => Promise<AppSnapshot | null>;
listCaptureSources: () => Promise<CaptureSourceInfo[]>;
captureSource: (
sourceId: string,
delayMs?: number,
focusGenshin?: boolean,
options?: CaptureOptions,
) => Promise<CaptureResult>;
exportGood: (payload: GoodDatabase) => Promise<SaveResultWithPath>;
importGoodFile: () => Promise<GoodImportFileResult>;
showOverlay: () => Promise<BooleanResult>;
loadArtifacts: () => Promise<ArtifactStoreLoadResult>;
saveArtifacts: (records: StoredArtifactRecord[]) => Promise<ArtifactStoreSaveResult>;
loadReviewSamples: (limit?: number) => Promise<ReviewSampleListResult>;
saveReviewSample: (sample: ReviewSamplePayload) => Promise<SaveResultWithPath>;
loadScannerLearningRules: () => Promise<LoadScannerLearningRulesResult>;
saveScannerLearningRules: (rules: ScannerLearningRulePayload) => Promise<SaveScannerLearningRulesResult>;
getRuntimeInfo: () => Promise<RuntimeInfo>;
getAutomationGuard: () => Promise<AutomationGuard>;
publishScannerStatus: (status: ScannerStatusPayload) => Promise<BooleanResult>;
focusMainWindow: () => Promise<BooleanResult>;
focusGenshin: () => Promise<FocusGenshinResult>;
focusGenshinForScanStart: () => Promise<FocusGenshinResult>;
clickScreen: (x: number, y: number) => Promise<ClickResult>;
scrollScreen: (notches: number, anchorX?: number, anchorY?: number) => Promise<ScrollResult>;
keyPress: (key: string) => Promise<KeyPressResult>;
onScannerCommand: (callback: (command: ScannerCommand) => void) => () => void;
}
function hasFunction(api: Record<string, unknown>, key: string): boolean {
return typeof api[key] === "function";
}
export function getAssistantBridge(): AssistantBridge | null {
const api = window.assistantApi;
if (!api) return null;
const apiRecord = api as unknown as Record<string, unknown>;
const canAutoScan = hasFunction(apiRecord, "clickScreen") && hasFunction(apiRecord, "scrollScreen");
const canReviewSamples = hasFunction(apiRecord, "loadReviewSamples") && hasFunction(apiRecord, "saveReviewSample");
const hasFocusGenshinForScanStart = hasFunction(apiRecord, "focusGenshinForScanStart");
return {
isAvailable: true,
canExportGood: Boolean(api.exportGood),
canShowOverlay: Boolean(api.showOverlay),
canAutoScan,
canReviewSamples,
loadSnapshot: () => api.loadSnapshot(),
saveSnapshot: (snapshot: AppSnapshot) => api.saveSnapshot(snapshot),
runMockScan: () => api.runMockScan(),
listCaptureSources: () => api.listCaptureSources(),
captureSource: (sourceId, delayMs, focusGenshin, options) => api.captureSource(sourceId, delayMs, focusGenshin, options),
exportGood: (payload) => api.exportGood(payload),
importGoodFile: () => api.importGoodFile(),
loadArtifacts: () => api.loadArtifacts(),
saveArtifacts: (records) => api.saveArtifacts(records),
loadReviewSamples: (limit = 50) => api.loadReviewSamples(limit),
saveReviewSample: (sample) => api.saveReviewSample(sample),
loadScannerLearningRules: () => api.loadScannerLearningRules(),
saveScannerLearningRules: (rules) => api.saveScannerLearningRules(rules),
getRuntimeInfo: () => api.getRuntimeInfo(),
getAutomationGuard: () => api.getAutomationGuard(),
publishScannerStatus: (status) => api.publishScannerStatus(status),
focusMainWindow: () => api.focusMainWindow(),
focusGenshin: () => api.focusGenshin(),
focusGenshinForScanStart: () => (hasFocusGenshinForScanStart ? api.focusGenshinForScanStart() : api.focusGenshin()),
clickScreen: (x: number, y: number) => api.clickScreen(x, y),
scrollScreen: (notches: number, anchorX?: number, anchorY?: number) => api.scrollScreen(notches, anchorX, anchorY),
keyPress: (key: string) => api.keyPress(key),
showOverlay: () => api.showOverlay(),
onScannerCommand: (callback) => api.onScannerCommand(callback),
};
}