import Logger from './logger'; import TabsHook from './tabs-hook'; import { FaPlug } from "react-icons/fa"; import PluginView from "./components/PluginView"; import TitleView from "./components/TitleView"; import LegacyPlugin from "./components/LegacyPlugin" interface Plugin { name: any; content: any; icon: any; onDismount?(): void; } declare global { interface Window { __DeckyEvLoop: PluginEventTarget; __DeckyRunningPlugin: string; } } class PluginEventTarget extends EventTarget { } window.__DeckyEvLoop = new PluginEventTarget(); class PluginLoader extends Logger { private plugins: Plugin[] = []; private tabsHook: TabsHook = new TabsHook(); constructor() { super(PluginLoader.name); this.log('Initialized'); this.tabsHook.add({ id: "main", title: , content: , icon: }); SteamClient.Input.RegisterForControllerInputMessages(this.handleBack); window.__DeckyEvLoop.addEventListener("pluginOpen", (x) => window.__DeckyRunningPlugin = x.data); window.__DeckyEvLoop.addEventListener("pluginClose", (_) => window.__DeckyRunningPlugin = ""); } private handleBack(ev) { const e = ev[0]; if (e.strActionName == "B" && window.__DeckyRunningPlugin) window.__DeckyEvLoop.dispatchEvent(new Event("pluginClose")); } public async importPlugin(name: string) { this.log(`Trying to load ${name}`); let find = this.plugins.find(x => x.name == name); if (find) this.plugins.splice(this.plugins.indexOf(find), 1); if (name.startsWith("$LEGACY_")) this.importLegacyPlugin(name.replace("$LEGACY_", "")); else this.importReactPlugin(name); this.log(`Loaded ${name}`); const ev = new Event("setPlugins"); ev.data = this.plugins; window.__DeckyEvLoop.dispatchEvent(ev); } private async importReactPlugin(name: string) { let res = await fetch(`http://127.0.0.1:1337/plugins/${name}/frontend_bundle`); if (res.ok) { let content = await eval(await res.text())(PluginLoader.createPluginAPI(name)); this.plugins.push({ name: name, icon: content.icon, content: content.content }); } else throw new Error(`${name} frontend_bundle not OK`); } private async importLegacyPlugin(name: string) { const url = `http://127.0.0.1:1337/plugins/load_main/${name}`; this.plugins.push({ name: name, icon: , content: }); } static createPluginAPI(pluginName) { return { async callServerMethod(methodName, args = {}) { const response = await fetch(`http://127.0.0.1:1337/methods/${methodName}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(args), }); return response.json(); }, async callPluginMethod(methodName, args = {}) { const response = await fetch(`http://127.0.0.1:1337/plugins/${pluginName}/methods/${methodName}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ args, }), }); return response.json(); }, fetchNoCors(url, request: any = {}) { let args = { method: 'POST', headers: {}, body: '' }; const req = { ...args, ...request, url, data: request.body }; return this.callServerMethod('http_request', req); }, executeInTab(tab, runAsync, code) { return this.callServerMethod('execute_in_tab', { tab, run_async: runAsync, code, }); }, injectCssIntoTab(tab, style) { return this.callServerMethod('inject_css_into_tab', { tab, style, }); }, removeCssFromTab(tab, cssId) { return this.callServerMethod('remove_css_from_tab', { tab, css_id: cssId, }); }, }; } } export default PluginLoader;