export interface HostConfig { shortcuts: ShortcutAction[] restoreClipboard: boolean clientLog: string | null gameConfig: string | null stashScroll: boolean overlayKey: string logKeys: boolean windowTitle: string language: string } export interface ShortcutAction { shortcut: string keepModKeys?: true action: { type: 'copy-item' focusOverlay?: boolean target: string } | { type: 'ocr-text' target: 'heist-gems' } | { type: 'trigger-event' target: string } | { type: 'stash-search' text: string } | { type: 'toggle-overlay' } | { type: 'paste-in-chat' text: string send: boolean } | { type: 'test-only' } } export type UpdateInfo = { state: 'initial' | 'checking-for-update' } | { state: 'update-available' version: string noDownloadReason: 'not-supported' | 'disabled-by-flag' | null } | { state: 'update-downloaded' version: string } | { state: 'update-not-available' | 'error' checkedAt: number } export interface HostState { contents: string | null version: string updater: UpdateInfo } export type IpcEvent = // events that have meaning only in Overlay mode: IpcOverlayAttached | IpcFocusChange | IpcVisibility | IpcFocusGame | IpcHideExclusiveWidget | IpcTrackArea | // events used by any type of Client: IpcSaveConfig | IpcUpdaterState | IpcGameLog | IpcClientIsActive | IpcLogEntry | IpcHostConfig | IpcWidgetAction | IpcItemText | IpcOcrText | IpcConfigChanged | IpcUserAction export type IpcEventPayload = T extends { name: Name, payload: infer P } ? P : never type IpcOverlayAttached = Event<'MAIN->OVERLAY::overlay-attached'> type IpcFocusChange = Event<'MAIN->OVERLAY::focus-change', { game: boolean overlay: boolean usingHotkey: boolean }> type IpcVisibility = Event<'MAIN->OVERLAY::visibility', { isVisible: boolean }> type IpcFocusGame = Event<'OVERLAY->MAIN::focus-game'> type IpcHideExclusiveWidget = Event<'MAIN->OVERLAY::hide-exclusive-widget'> type IpcTrackArea = Event<'OVERLAY->MAIN::track-area', { holdKey: string closeThreshold: number from: { x: number, y: number } area: { x: number, y: number, width: number, height: number } dpr: number }> type IpcHostConfig = Event<'CLIENT->MAIN::update-host-config', HostConfig> type IpcClientIsActive = Event<'CLIENT->MAIN::used-recently', { isOverlay: boolean }> type IpcSaveConfig = Event<'CLIENT->MAIN::save-config', { contents: string isTemporary: boolean }> type IpcConfigChanged = Event<'MAIN->CLIENT::config-changed', { contents: string }> type IpcLogEntry = Event<'MAIN->CLIENT::log-entry', { message: string }> type IpcWidgetAction = Event<'MAIN->CLIENT::widget-action', { target: string }> type IpcItemText = Event<'MAIN->CLIENT::item-text', { target: string clipboard: string item?: unknown position: { x: number, y: number } focusOverlay: boolean }> type IpcOcrText = Event<'MAIN->CLIENT::ocr-text', { target: string pressTime: number ocrTime: number paragraphs: string[] }> type IpcGameLog = Event<'MAIN->CLIENT::game-log', { lines: string[] }> type IpcUpdaterState = Event<'MAIN->CLIENT::updater-state', UpdateInfo> // Hotkeyable actions are defined in `ShortcutAction`. // Actions below are triggered by user interaction with the UI. type IpcUserAction = Event<'CLIENT->MAIN::user-action', { action: 'check-for-update' | 'update-and-restart' | 'quit' } | { action: 'stash-search' text: string }> interface Event { name: TName payload: TPayload }