package plugin_ui import "github.com/goccy/go-json" ///////////////////////////////////////////////////////////////////////////////////// // Client to server ///////////////////////////////////////////////////////////////////////////////////// type ClientEventType string // ClientPluginEvent is an event received from the client type ClientPluginEvent struct { // ExtensionID is the "sent to" // If not set, the event is being sent to all plugins ExtensionID string `json:"extensionId,omitempty"` Type ClientEventType `json:"type"` Payload interface{} `json:"payload"` } const ( ClientRenderTrayEvent ClientEventType = "tray:render" // Client wants to render the tray ClientListTrayIconsEvent ClientEventType = "tray:list-icons" // Client wants to list all icons from all plugins ClientTrayOpenedEvent ClientEventType = "tray:opened" // When the tray is opened ClientTrayClosedEvent ClientEventType = "tray:closed" // When the tray is closed ClientTrayClickedEvent ClientEventType = "tray:clicked" // When the tray is clicked ClientListCommandPalettesEvent ClientEventType = "command-palette:list" // When the client wants to list all command palettes ClientCommandPaletteOpenedEvent ClientEventType = "command-palette:opened" // When the client opens the command palette ClientCommandPaletteClosedEvent ClientEventType = "command-palette:closed" // When the client closes the command palette ClientRenderCommandPaletteEvent ClientEventType = "command-palette:render" // When the client requests the command palette to render ClientCommandPaletteInputEvent ClientEventType = "command-palette:input" // The client sends the current input of the command palette ClientCommandPaletteItemSelectedEvent ClientEventType = "command-palette:item-selected" // When the client selects an item from the command palette ClientActionRenderAnimePageButtonsEvent ClientEventType = "action:anime-page-buttons:render" // When the client requests the buttons to display on the anime page ClientActionRenderAnimePageDropdownItemsEvent ClientEventType = "action:anime-page-dropdown-items:render" // When the client requests the dropdown items to display on the anime page ClientActionRenderMangaPageButtonsEvent ClientEventType = "action:manga-page-buttons:render" // When the client requests the buttons to display on the manga page ClientActionRenderMediaCardContextMenuItemsEvent ClientEventType = "action:media-card-context-menu-items:render" // When the client requests the context menu items to display on the media card ClientActionRenderAnimeLibraryDropdownItemsEvent ClientEventType = "action:anime-library-dropdown-items:render" // When the client requests the dropdown items to display on the anime library ClientActionRenderEpisodeCardContextMenuItemsEvent ClientEventType = "action:episode-card-context-menu-items:render" // When the client requests the context menu items to display on the episode card ClientActionRenderEpisodeGridItemMenuItemsEvent ClientEventType = "action:episode-grid-item-menu-items:render" // When the client requests the context menu items to display on the episode grid item ClientActionClickedEvent ClientEventType = "action:clicked" // When the user clicks on an action ClientFormSubmittedEvent ClientEventType = "form:submitted" // When the form registered by the tray is submitted ClientScreenChangedEvent ClientEventType = "screen:changed" // When the current screen changes ClientEventHandlerTriggeredEvent ClientEventType = "handler:triggered" // When a custom event registered by the plugin is triggered ClientFieldRefSendValueEvent ClientEventType = "field-ref:send-value" // When the client sends the value of a field that has a ref ClientDOMQueryResultEvent ClientEventType = "dom:query-result" // Result of a DOM query ClientDOMQueryOneResultEvent ClientEventType = "dom:query-one-result" // Result of a DOM query for one element ClientDOMObserveResultEvent ClientEventType = "dom:observe-result" // Result of a DOM observation ClientDOMStopObserveEvent ClientEventType = "dom:stop-observe" // Stop observing DOM elements ClientDOMCreateResultEvent ClientEventType = "dom:create-result" // Result of creating a DOM element ClientDOMElementUpdatedEvent ClientEventType = "dom:element-updated" // When a DOM element is updated ClientDOMEventTriggeredEvent ClientEventType = "dom:event-triggered" // When a DOM event is triggered ClientDOMReadyEvent ClientEventType = "dom:ready" // When a DOM element is ready ) type ClientRenderTrayEventPayload struct{} type ClientListTrayIconsEventPayload struct{} type ClientTrayOpenedEventPayload struct{} type ClientTrayClosedEventPayload struct{} type ClientTrayClickedEventPayload struct{} type ClientActionRenderAnimePageButtonsEventPayload struct{} type ClientActionRenderAnimePageDropdownItemsEventPayload struct{} type ClientActionRenderMangaPageButtonsEventPayload struct{} type ClientActionRenderMediaCardContextMenuItemsEventPayload struct{} type ClientActionRenderAnimeLibraryDropdownItemsEventPayload struct{} type ClientActionRenderEpisodeCardContextMenuItemsEventPayload struct{} type ClientActionRenderEpisodeGridItemMenuItemsEventPayload struct{} type ClientListCommandPalettesEventPayload struct{} type ClientCommandPaletteOpenedEventPayload struct{} type ClientCommandPaletteClosedEventPayload struct{} type ClientActionClickedEventPayload struct { ActionID string `json:"actionId"` Event map[string]interface{} `json:"event"` } type ClientEventHandlerTriggeredEventPayload struct { HandlerName string `json:"handlerName"` Event map[string]interface{} `json:"event"` } type ClientFormSubmittedEventPayload struct { FormName string `json:"formName"` Data map[string]interface{} `json:"data"` } type ClientScreenChangedEventPayload struct { Pathname string `json:"pathname"` Query string `json:"query"` } type ClientFieldRefSendValueEventPayload struct { FieldRef string `json:"fieldRef"` Value interface{} `json:"value"` } type ClientRenderCommandPaletteEventPayload struct{} type ClientCommandPaletteItemSelectedEventPayload struct { ItemID string `json:"itemId"` } type ClientCommandPaletteInputEventPayload struct { Value string `json:"value"` } type ClientDOMEventTriggeredEventPayload struct { ElementId string `json:"elementId"` EventType string `json:"eventType"` Event map[string]interface{} `json:"event"` } type ClientDOMQueryResultEventPayload struct { RequestID string `json:"requestId"` Elements []interface{} `json:"elements"` } type ClientDOMQueryOneResultEventPayload struct { RequestID string `json:"requestId"` Element interface{} `json:"element"` } type ClientDOMObserveResultEventPayload struct { ObserverId string `json:"observerId"` Elements []interface{} `json:"elements"` } type ClientDOMCreateResultEventPayload struct { RequestID string `json:"requestId"` Element interface{} `json:"element"` } type ClientDOMElementUpdatedEventPayload struct { ElementId string `json:"elementId"` Action string `json:"action"` Result interface{} `json:"result"` RequestID string `json:"requestId"` } type ClientDOMStopObserveEventPayload struct { ObserverId string `json:"observerId"` } type ClientDOMReadyEventPayload struct { } ///////////////////////////////////////////////////////////////////////////////////// // Server to client ///////////////////////////////////////////////////////////////////////////////////// type ServerEventType string // ServerPluginEvent is an event sent to the client type ServerPluginEvent struct { ExtensionID string `json:"extensionId"` // Extension ID must be set Type ServerEventType `json:"type"` Payload interface{} `json:"payload"` } const ( ServerTrayUpdatedEvent ServerEventType = "tray:updated" // When the trays are updated ServerTrayIconEvent ServerEventType = "tray:icon" // When the tray sends its icon to the client ServerTrayBadgeUpdatedEvent ServerEventType = "tray:badge-updated" // When the tray badge is updated ServerTrayOpenEvent ServerEventType = "tray:open" // When the tray is opened ServerTrayCloseEvent ServerEventType = "tray:close" // When the tray is closed ServerCommandPaletteInfoEvent ServerEventType = "command-palette:info" // When the command palette sends its state to the client ServerCommandPaletteUpdatedEvent ServerEventType = "command-palette:updated" // When the command palette is updated ServerCommandPaletteOpenEvent ServerEventType = "command-palette:open" // When the command palette is opened ServerCommandPaletteCloseEvent ServerEventType = "command-palette:close" // When the command palette is closed ServerCommandPaletteGetInputEvent ServerEventType = "command-palette:get-input" // When the command palette requests the input from the client ServerCommandPaletteSetInputEvent ServerEventType = "command-palette:set-input" // When the command palette sets the input ServerActionRenderAnimePageButtonsEvent ServerEventType = "action:anime-page-buttons:updated" // When the server renders the anime page buttons ServerActionRenderAnimePageDropdownItemsEvent ServerEventType = "action:anime-page-dropdown-items:updated" // When the server renders the anime page dropdown items ServerActionRenderMangaPageButtonsEvent ServerEventType = "action:manga-page-buttons:updated" // When the server renders the manga page buttons ServerActionRenderMediaCardContextMenuItemsEvent ServerEventType = "action:media-card-context-menu-items:updated" // When the server renders the media card context menu items ServerActionRenderEpisodeCardContextMenuItemsEvent ServerEventType = "action:episode-card-context-menu-items:updated" // When the server renders the episode card context menu items ServerActionRenderEpisodeGridItemMenuItemsEvent ServerEventType = "action:episode-grid-item-menu-items:updated" // When the server renders the episode grid item menu items ServerActionRenderAnimeLibraryDropdownItemsEvent ServerEventType = "action:anime-library-dropdown-items:updated" // When the server renders the anime library dropdown items ServerFormResetEvent ServerEventType = "form:reset" ServerFormSetValuesEvent ServerEventType = "form:set-values" ServerFieldRefSetValueEvent ServerEventType = "field-ref:set-value" // Set the value of a field (not in a form) ServerFatalErrorEvent ServerEventType = "fatal-error" // When the UI encounters a fatal error ServerScreenNavigateToEvent ServerEventType = "screen:navigate-to" // Navigate to a new screen ServerScreenReloadEvent ServerEventType = "screen:reload" // Reload the current screen ServerScreenGetCurrentEvent ServerEventType = "screen:get-current" // Get the current screen ServerDOMQueryEvent ServerEventType = "dom:query" // When the server queries for DOM elements ServerDOMQueryOneEvent ServerEventType = "dom:query-one" // When the server queries for a single DOM element ServerDOMObserveEvent ServerEventType = "dom:observe" // When the server starts observing DOM elements ServerDOMStopObserveEvent ServerEventType = "dom:stop-observe" // When the server stops observing DOM elements ServerDOMCreateEvent ServerEventType = "dom:create" // When the server creates a DOM element ServerDOMManipulateEvent ServerEventType = "dom:manipulate" // When the server manipulates a DOM element ServerDOMObserveInViewEvent ServerEventType = "dom:observe-in-view" ) type ServerTrayUpdatedEventPayload struct { Components interface{} `json:"components"` } type ServerCommandPaletteUpdatedEventPayload struct { Placeholder string `json:"placeholder"` Items interface{} `json:"items"` } type ServerTrayOpenEventPayload struct { ExtensionID string `json:"extensionId"` } type ServerTrayCloseEventPayload struct { ExtensionID string `json:"extensionId"` } type ServerTrayIconEventPayload struct { ExtensionID string `json:"extensionId"` ExtensionName string `json:"extensionName"` IconURL string `json:"iconUrl"` WithContent bool `json:"withContent"` TooltipText string `json:"tooltipText"` BadgeNumber int `json:"badgeNumber"` BadgeIntent string `json:"badgeIntent"` Width string `json:"width,omitempty"` MinHeight string `json:"minHeight,omitempty"` } type ServerTrayBadgeUpdatedEventPayload struct { BadgeNumber int `json:"badgeNumber"` BadgeIntent string `json:"badgeIntent"` } type ServerFormResetEventPayload struct { FormName string `json:"formName"` FieldToReset string `json:"fieldToReset"` // If not set, the form will be reset } type ServerFormSetValuesEventPayload struct { FormName string `json:"formName"` Data map[string]interface{} `json:"data"` } type ServerFieldRefSetValueEventPayload struct { FieldRef string `json:"fieldRef"` Value interface{} `json:"value"` } type ServerFieldRefGetValueEventPayload struct { FieldRef string `json:"fieldRef"` } type ServerFatalErrorEventPayload struct { Error string `json:"error"` } type ServerScreenNavigateToEventPayload struct { Path string `json:"path"` } type ServerActionRenderAnimePageButtonsEventPayload struct { Buttons interface{} `json:"buttons"` } type ServerActionRenderAnimePageDropdownItemsEventPayload struct { Items interface{} `json:"items"` } type ServerActionRenderMangaPageButtonsEventPayload struct { Buttons interface{} `json:"buttons"` } type ServerActionRenderMediaCardContextMenuItemsEventPayload struct { Items interface{} `json:"items"` } type ServerActionRenderAnimeLibraryDropdownItemsEventPayload struct { Items interface{} `json:"items"` } type ServerActionRenderEpisodeCardContextMenuItemsEventPayload struct { Items interface{} `json:"items"` } type ServerActionRenderEpisodeGridItemMenuItemsEventPayload struct { Items interface{} `json:"items"` } type ServerScreenReloadEventPayload struct{} type ServerCommandPaletteInfoEventPayload struct { Placeholder string `json:"placeholder"` KeyboardShortcut string `json:"keyboardShortcut"` } type ServerCommandPaletteOpenEventPayload struct{} type ServerCommandPaletteCloseEventPayload struct{} type ServerCommandPaletteGetInputEventPayload struct{} type ServerCommandPaletteSetInputEventPayload struct { Value string `json:"value"` } type ServerScreenGetCurrentEventPayload struct{} /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// func NewClientPluginEvent(data map[string]interface{}) *ClientPluginEvent { extensionID, ok := data["extensionId"].(string) if !ok { extensionID = "" } eventType, ok := data["type"].(string) if !ok { return nil } payload, ok := data["payload"] if !ok { return nil } return &ClientPluginEvent{ ExtensionID: extensionID, Type: ClientEventType(eventType), Payload: payload, } } func (e *ClientPluginEvent) ParsePayload(ret interface{}) bool { data, err := json.Marshal(e.Payload) if err != nil { return false } if err := json.Unmarshal(data, &ret); err != nil { return false } return true } func (e *ClientPluginEvent) ParsePayloadAs(t ClientEventType, ret interface{}) bool { if e.Type != t { return false } return e.ParsePayload(ret) } // Add DOM event payloads type ServerDOMQueryEventPayload struct { Selector string `json:"selector"` RequestID string `json:"requestId"` WithInnerHTML bool `json:"withInnerHTML"` WithOuterHTML bool `json:"withOuterHTML"` IdentifyChildren bool `json:"identifyChildren"` } type ServerDOMQueryOneEventPayload struct { Selector string `json:"selector"` RequestID string `json:"requestId"` WithInnerHTML bool `json:"withInnerHTML"` WithOuterHTML bool `json:"withOuterHTML"` IdentifyChildren bool `json:"identifyChildren"` } type ServerDOMObserveEventPayload struct { Selector string `json:"selector"` ObserverId string `json:"observerId"` WithInnerHTML bool `json:"withInnerHTML"` WithOuterHTML bool `json:"withOuterHTML"` IdentifyChildren bool `json:"identifyChildren"` } type ServerDOMStopObserveEventPayload struct { ObserverId string `json:"observerId"` } type ServerDOMCreateEventPayload struct { TagName string `json:"tagName"` RequestID string `json:"requestId"` } type ServerDOMManipulateEventPayload struct { ElementId string `json:"elementId"` Action string `json:"action"` Params map[string]interface{} `json:"params"` RequestID string `json:"requestId"` } type ServerDOMObserveInViewEventPayload struct { Selector string `json:"selector"` ObserverId string `json:"observerId"` WithInnerHTML bool `json:"withInnerHTML"` WithOuterHTML bool `json:"withOuterHTML"` IdentifyChildren bool `json:"identifyChildren"` Margin string `json:"margin"` }