From 44e3d2907a97b6158d034e6f24578069615ecf26 Mon Sep 17 00:00:00 2001 From: Fairy-Phy Date: Sat, 11 Nov 2023 17:45:57 +0900 Subject: [PATCH] move plugin move to account. --- locales/index.d.ts | 3 ++ locales/ja-JP.yml | 3 ++ .../frontend/src/pages/settings/plugin.vue | 37 ++++++++++++++++++- .../frontend/src/scripts/install-plugin.ts | 7 +--- packages/frontend/src/scripts/xxhash.ts | 6 +++ 5 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 packages/frontend/src/scripts/xxhash.ts diff --git a/locales/index.d.ts b/locales/index.d.ts index 5a2f3f77b2..b869c3b5e7 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1167,6 +1167,9 @@ export interface Locale { "overrideSourceCodeOnly": string; "syncSetting": string; "syncing": string; + "movePluginToAccount": string; + "movePluginToAccountConfirm": string; + "overridePluginConfirm": string; "_announcement": { "forExistingUsers": string; "forExistingUsersDescription": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 5b070eca3e..d974ff06ef 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1164,6 +1164,9 @@ duplicateSyncedPlugin: "このプラグインは同期されているプラグ overrideSourceCodeOnly: "コードのみを上書きする" syncSetting: "同期設定" syncing: "他端末と同期" +movePluginToAccount: "アカウントに移行" +movePluginToAccountConfirm: "プラグインをアカウントに移行して他端末と同期しますか?プラグインとプラグイン設定以外は引き継がれません。" +overridePluginConfirm: "すでにプラグインがアカウントに存在します。上書きしますか?アカウントにあるプラグインデータは削除されます。" _announcement: forExistingUsers: "既存ユーザーのみ" diff --git a/packages/frontend/src/pages/settings/plugin.vue b/packages/frontend/src/pages/settings/plugin.vue index f64c554561..68982ed0ac 100644 --- a/packages/frontend/src/pages/settings/plugin.vue +++ b/packages/frontend/src/pages/settings/plugin.vue @@ -38,6 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.settings }} + {{ i18n.ts.movePluginToAccount }} {{ i18n.ts.uninstall }}
@@ -75,6 +76,8 @@ import { unisonReload } from '@/scripts/unison-reload.js'; import { i18n } from '@/i18n.js'; import { definePageMetadata } from '@/scripts/page-metadata.js'; import { getPluginList } from '@/plugin.js'; +import { toHash } from '@/scripts/xxhash.js'; +import { savePluginToAccount } from '@/scripts/install-plugin.js'; let plugins = Object.values(await getPluginList()); plugins.push(...ColdDeviceStorage.get('plugins')); @@ -87,7 +90,8 @@ async function uninstall(plugin) { await os.api('i/registry/remove-all-keys-in-scope', { scope: ['client', 'aiscript', 'plugins', plugin.id] }); await os.api('i/registry/set', { scope: ['client'], key: 'plugins', value: plugins }); } else { - ColdDeviceStorage.set('plugins', plugins.value.filter(x => x.id !== plugin.id)); + const coldPlugins = ColdDeviceStorage.get('plugins'); + ColdDeviceStorage.set('plugins', coldPlugins.filter(x => x.id !== plugin.id)); } await os.apiWithDialog('i/revoke-token', { token: plugin.token, @@ -97,6 +101,37 @@ async function uninstall(plugin) { }); } +async function moveToAccount(plugin) { + const { canceled } = await os.confirm({ + type: 'warning', + text: i18n.ts.movePluginToAccountConfirm, + }); + + if (canceled) return; + + const hash = await toHash(plugin.name, plugin.author); + const plugins = await getPluginList(); + if (Object.keys(plugins).some(v => v === hash)) { + const { canceled } = await os.confirm({ + type: 'warning', + text: i18n.ts.overridePluginConfirm, + }); + + if (canceled) return; + + await os.api('i/registry/remove-all-keys-in-scope', { scope: ['client', 'aiscript', 'plugins', hash] }); + } + + const coldPlugins = ColdDeviceStorage.get('plugins'); + ColdDeviceStorage.set('plugins', coldPlugins.filter(x => x.id !== plugin.id)); + + plugin.id = hash; + plugin.fromAccount = true; + plugins[hash] = plugin; + + await os.api('i/registry/set', { scope: ['client'], key: 'plugins', value: plugins }); +} + function copy(plugin) { copyToClipboard(plugin.src ?? ''); os.success(); diff --git a/packages/frontend/src/scripts/install-plugin.ts b/packages/frontend/src/scripts/install-plugin.ts index cc73524f1a..e6576b8bb9 100644 --- a/packages/frontend/src/scripts/install-plugin.ts +++ b/packages/frontend/src/scripts/install-plugin.ts @@ -6,13 +6,13 @@ import { defineAsyncComponent } from 'vue'; import { compareVersions } from 'compare-versions'; import { v4 as uuid } from 'uuid'; -import xxhash from 'xxhash-wasm'; import { Interpreter, Parser, utils } from '@syuilo/aiscript'; import type { Plugin } from '@/store.js'; import { ColdDeviceStorage } from '@/store.js'; import * as os from '@/os.js'; import { i18n } from '@/i18n.js'; import { getPluginList } from '@/plugin.js'; +import { toHash } from './xxhash.js'; export type AiScriptPluginMeta = { name: string; @@ -25,11 +25,6 @@ export type AiScriptPluginMeta = { const parser = new Parser(); -async function toHash(name: string, author: string) { - const { h32ToString } = await xxhash(); - return h32ToString(author + name); -} - export function savePlugin({ id, meta, src, token }: { id: string; meta: AiScriptPluginMeta; diff --git a/packages/frontend/src/scripts/xxhash.ts b/packages/frontend/src/scripts/xxhash.ts new file mode 100644 index 0000000000..78709967e2 --- /dev/null +++ b/packages/frontend/src/scripts/xxhash.ts @@ -0,0 +1,6 @@ +import xxhash from 'xxhash-wasm'; + +export async function toHash(name: string, author: string) { + const { h32ToString } = await xxhash(); + return h32ToString(author + name); +}