use metadata id as preference

This commit is contained in:
Fairy-Phy 2023-11-17 16:59:44 +09:00
parent f55323d161
commit 0191a69987
No known key found for this signature in database
GPG Key ID: 53E58673D5961DB5
1 changed files with 20 additions and 13 deletions

View File

@ -21,6 +21,7 @@ export type AiScriptPluginMeta = {
description?: string; description?: string;
permissions?: string[]; permissions?: string[];
config?: Record<string, any>; config?: Record<string, any>;
id?: string;
}; };
const parser = new Parser(); const parser = new Parser();
@ -42,19 +43,19 @@ export function savePlugin({ id, meta, src, token }: {
} as Plugin)); } as Plugin));
} }
async function savePluginToAccount(pluginOnlyOverride: boolean, { hash, meta, src, token }: { async function savePluginToAccount(pluginOnlyOverride: boolean, { id, meta, src, token }: {
hash: string; id: string;
meta: AiScriptPluginMeta; meta: AiScriptPluginMeta;
src: string; src: string;
token: string; token: string;
}) { }) {
const plugins = await getPluginList(); const plugins = await getPluginList();
// pluginOnlyOverrideがtrueになっているということはすでに重複していることが確定している // pluginOnlyOverrideがtrueになっているということはすでに重複していることが確定している
const configData = pluginOnlyOverride ? plugins[hash].configData : {}; const configData = pluginOnlyOverride ? plugins[id].configData : {};
const pluginToken = pluginOnlyOverride ? plugins[hash].token : token; const pluginToken = pluginOnlyOverride ? plugins[id].token : token;
plugins[hash] = { plugins[id] = {
...meta, ...meta,
id: hash, id,
active: true, active: true,
configData, configData,
token: pluginToken, token: pluginToken,
@ -63,7 +64,7 @@ async function savePluginToAccount(pluginOnlyOverride: boolean, { hash, meta, sr
} as Plugin; } as Plugin;
if (!pluginOnlyOverride) { if (!pluginOnlyOverride) {
await os.api('i/registry/remove-all-keys-in-scope', { scope: ['client', 'aiscript', 'plugins', hash] }); await os.api('i/registry/remove-all-keys-in-scope', { scope: ['client', 'aiscript', 'plugins', id] });
} }
await os.api('i/registry/set', { scope: ['client'], key: 'plugins', value: plugins }); await os.api('i/registry/set', { scope: ['client'], key: 'plugins', value: plugins });
@ -106,11 +107,15 @@ export async function parsePluginMeta(code: string): Promise<AiScriptPluginMeta>
throw new Error('Metadata not found'); throw new Error('Metadata not found');
} }
const { name, version, author, description, permissions, config } = metadata; const { name, version, author, description, permissions, config, id } = metadata;
if (name == null || version == null || author == null) { if (name == null || version == null || author == null) {
throw new Error('Required property not found'); throw new Error('Required property not found');
} }
if (id != null && !/^[a-zA-Z0-9_]+$/.test(id)) {
throw new Error('Invalid id format.');
}
return { return {
name, name,
version, version,
@ -118,6 +123,7 @@ export async function parsePluginMeta(code: string): Promise<AiScriptPluginMeta>
description, description,
permissions, permissions,
config, config,
id,
}; };
} }
@ -134,15 +140,16 @@ export async function installPlugin(code: string, meta?: AiScriptPluginMeta) {
const plugins = Object.keys(await getPluginList()); const plugins = Object.keys(await getPluginList());
const pluginHash = await toHash(realMeta.name, realMeta.author); const pluginHash = await toHash(realMeta.name, realMeta.author);
const { isLocal, pluginOnlyOverride } = (await new Promise((res, rej) => { const { isLocal, pluginOnlyOverride } = await new Promise((res, rej) => {
const pluginCheckId = realMeta.id ?? pluginHash;
os.popup(defineAsyncComponent(() => import('@/components/MkPluginSelectSaveWindow.vue')), { os.popup(defineAsyncComponent(() => import('@/components/MkPluginSelectSaveWindow.vue')), {
isExistsFromAccount: plugins.some(v => v === pluginHash) isExistsFromAccount: plugins.some(v => v === pluginCheckId)
}, { }, {
done: result => { done: result => {
res(result); res(result);
}, },
}, 'closed'); }, 'closed');
})); });
const token = realMeta.permissions == null || realMeta.permissions.length === 0 || pluginOnlyOverride ? null : await new Promise((res, rej) => { const token = realMeta.permissions == null || realMeta.permissions.length === 0 || pluginOnlyOverride ? null : await new Promise((res, rej) => {
os.popup(defineAsyncComponent(() => import('@/components/MkTokenGenerateWindow.vue')), { os.popup(defineAsyncComponent(() => import('@/components/MkTokenGenerateWindow.vue')), {
@ -165,14 +172,14 @@ export async function installPlugin(code: string, meta?: AiScriptPluginMeta) {
if (isLocal) { if (isLocal) {
savePlugin({ savePlugin({
id: uuid(), id: realMeta.id ?? uuid(),
meta: realMeta, meta: realMeta,
token, token,
src: code, src: code,
}); });
} else { } else {
await savePluginToAccount(pluginOnlyOverride, { await savePluginToAccount(pluginOnlyOverride, {
hash: pluginHash, id: realMeta.id ?? pluginHash,
meta: realMeta, meta: realMeta,
token, token,
src: code, src: code,