Files
Exiled-Exchange-2/ipc/types.ts
2025-08-27 16:05:39 -05:00

215 lines
4.0 KiB
TypeScript

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<
Name extends IpcEvent["name"],
T extends IpcEvent = IpcEvent
> = 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<TName extends string, TPayload = undefined> {
name: TName;
payload: TPayload;
}