diff options
| author | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-03-09 21:57:56 +0900 |
|---|---|---|
| committer | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-03-09 21:57:56 +0900 |
| commit | c76afce9a752f6c5e2a65aeb50ad12b90290628a (patch) | |
| tree | 01e96b1fc02767f58e1e0071911a2a3f752eff46 /packages/frontend/src/plugin.ts | |
| parent | Bump version to 2025.3.2-alpha.2 (diff) | |
| download | sharkey-c76afce9a752f6c5e2a65aeb50ad12b90290628a.tar.gz sharkey-c76afce9a752f6c5e2a65aeb50ad12b90290628a.tar.bz2 sharkey-c76afce9a752f6c5e2a65aeb50ad12b90290628a.zip | |
enhance(frontend): improve plugin management
Diffstat (limited to 'packages/frontend/src/plugin.ts')
| -rw-r--r-- | packages/frontend/src/plugin.ts | 71 |
1 files changed, 48 insertions, 23 deletions
diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts index 15644870e5..613e3a9df6 100644 --- a/packages/frontend/src/plugin.ts +++ b/packages/frontend/src/plugin.ts @@ -144,9 +144,12 @@ export async function installPlugin(code: string, meta?: AiScriptPluginMeta) { prefer.set('plugins', prefer.s.plugins.concat(plugin)); await authorizePlugin(plugin); + + await launchPlugin(installId); } export async function uninstallPlugin(plugin: Plugin) { + abortPlugin(plugin); prefer.set('plugins', prefer.s.plugins.filter(x => x.installId !== plugin.installId)); if (Object.hasOwn(store.state.pluginTokens, plugin.installId)) { await os.apiWithDialog('i/revoke-token', { @@ -158,26 +161,6 @@ export async function uninstallPlugin(plugin: Plugin) { } } -export async function configPlugin(plugin: Plugin) { - if (plugin.config == null) { - throw new Error('This plugin does not have a config'); - } - - const config = plugin.config; - for (const key in plugin.configData) { - config[key].default = plugin.configData[key]; - } - - const { canceled, result } = await os.form(plugin.name, config); - if (canceled) return; - - prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, configData: result } : x)); -} - -export function changePluginActive(plugin: Plugin, active: boolean) { - prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, active } : x)); -} - const pluginContexts = new Map<string, Interpreter>(); export const pluginLogs = ref(new Map<string, string[]>()); @@ -217,7 +200,18 @@ function addPluginHandler<K extends keyof HandlerDef>(installId: Plugin['install pluginHandlers.push({ pluginInstallId: installId, type, ctx }); } -export async function launchPlugin(plugin: Plugin): Promise<void> { +export function launchPlugins() { + for (const plugin of prefer.s.plugins) { + if (plugin.active) { + launchPlugin(plugin.installId); + } + } +} + +async function launchPlugin(id: Plugin['installId']): Promise<void> { + const plugin = prefer.s.plugins.find(x => x.installId === id); + if (!plugin) return; + // 後方互換性のため if (plugin.src == null) return; @@ -254,7 +248,7 @@ export async function launchPlugin(plugin: Plugin): Promise<void> { ); } -export function reloadPlugin(plugin: Plugin): void { +export function abortPlugin(plugin: Plugin): void { const pluginContext = pluginContexts.get(plugin.installId); if (!pluginContext) return; @@ -262,8 +256,39 @@ export function reloadPlugin(plugin: Plugin): void { pluginContexts.delete(plugin.installId); pluginLogs.value.delete(plugin.installId); pluginHandlers = pluginHandlers.filter(x => x.pluginInstallId !== plugin.installId); +} + +export function reloadPlugin(plugin: Plugin): void { + abortPlugin(plugin); + launchPlugin(plugin.installId); +} + +export async function configPlugin(plugin: Plugin) { + if (plugin.config == null) { + throw new Error('This plugin does not have a config'); + } + + const config = plugin.config; + for (const key in plugin.configData) { + config[key].default = plugin.configData[key]; + } + + const { canceled, result } = await os.form(plugin.name, config); + if (canceled) return; - launchPlugin(plugin); + prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, configData: result } : x)); + + reloadPlugin(plugin); +} + +export function changePluginActive(plugin: Plugin, active: boolean) { + prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, active } : x)); + + if (active) { + launchPlugin(plugin.installId); + } else { + abortPlugin(plugin); + } } function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Record<string, values.Value> { |