summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-01-03 15:51:49 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-01-03 15:51:49 +0900
commite44f83fb9c13e4fab8aee07603632d533d12b4d8 (patch)
treef6600883a03876d9d966ec377ef9ac8cb8888768 /packages
parentclean up (diff)
downloadsharkey-e44f83fb9c13e4fab8aee07603632d533d12b4d8.tar.gz
sharkey-e44f83fb9c13e4fab8aee07603632d533d12b4d8.tar.bz2
sharkey-e44f83fb9c13e4fab8aee07603632d533d12b4d8.zip
update AiScript to 0.12.0
Diffstat (limited to 'packages')
-rw-r--r--packages/backend/package.json1
-rw-r--r--packages/frontend/package.json2
-rw-r--r--packages/frontend/src/components/page/page.vue30
-rw-r--r--packages/frontend/src/pages/scratchpad.vue8
-rw-r--r--packages/frontend/src/pages/settings/general.vue2
-rw-r--r--packages/frontend/src/pages/settings/plugin.install.vue31
-rw-r--r--packages/frontend/src/pages/settings/preferences-backups.vue1
-rw-r--r--packages/frontend/src/plugin.ts15
-rw-r--r--packages/frontend/src/scripts/hpml/evaluator.ts61
-rw-r--r--packages/frontend/src/scripts/hpml/lib.ts5
-rw-r--r--packages/frontend/src/store.ts4
-rw-r--r--packages/frontend/src/widgets/aiscript.vue8
-rw-r--r--packages/frontend/src/widgets/button.vue8
13 files changed, 56 insertions, 120 deletions
diff --git a/packages/backend/package.json b/packages/backend/package.json
index e4e3274c0b..e78b3ef70a 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -37,7 +37,6 @@
"@nestjs/testing": "9.2.1",
"@peertube/http-signature": "1.7.0",
"@sinonjs/fake-timers": "10.0.2",
- "@syuilo/aiscript": "0.11.1",
"accepts": "^1.3.8",
"ajv": "8.11.2",
"archiver": "5.3.1",
diff --git a/packages/frontend/package.json b/packages/frontend/package.json
index e380165681..2506e8e9d3 100644
--- a/packages/frontend/package.json
+++ b/packages/frontend/package.json
@@ -11,7 +11,7 @@
"@rollup/plugin-alias": "4.0.2",
"@rollup/plugin-json": "6.0.0",
"@rollup/pluginutils": "5.0.2",
- "@syuilo/aiscript": "0.11.1",
+ "@syuilo/aiscript": "0.12.0",
"@tabler/icons": "^1.118.0",
"@vitejs/plugin-vue": "4.0.0",
"@vue/compiler-sfc": "3.2.45",
diff --git a/packages/frontend/src/components/page/page.vue b/packages/frontend/src/components/page/page.vue
index b5cb73c009..87a288befe 100644
--- a/packages/frontend/src/components/page/page.vue
+++ b/packages/frontend/src/components/page/page.vue
@@ -6,7 +6,6 @@
<script lang="ts">
import { defineComponent, onMounted, nextTick, onUnmounted, PropType } from 'vue';
-import { parse } from '@syuilo/aiscript';
import XBlock from './page.block.vue';
import { Hpml } from '@/scripts/hpml/evaluator';
import { url } from '@/config';
@@ -28,38 +27,11 @@ export default defineComponent({
randomSeed: Math.random(),
visitor: $i,
url: url,
- enableAiScript: !defaultStore.state.disablePagesScript,
});
onMounted(() => {
nextTick(() => {
- if (props.page.script && hpml.aiscript) {
- let ast;
- try {
- ast = parse(props.page.script);
- } catch (err) {
- console.error(err);
- /*os.alert({
- type: 'error',
- text: 'Syntax error :('
- });*/
- return;
- }
- hpml.aiscript.exec(ast).then(() => {
- hpml.eval();
- }).catch(err => {
- console.error(err);
- /*os.alert({
- type: 'error',
- text: err
- });*/
- });
- } else {
- hpml.eval();
- }
- });
- onUnmounted(() => {
- if (hpml.aiscript) hpml.aiscript.abort();
+ hpml.eval();
});
});
diff --git a/packages/frontend/src/pages/scratchpad.vue b/packages/frontend/src/pages/scratchpad.vue
index edb2d8e18c..9db17efc03 100644
--- a/packages/frontend/src/pages/scratchpad.vue
+++ b/packages/frontend/src/pages/scratchpad.vue
@@ -27,7 +27,7 @@ import 'prismjs/components/prism-javascript';
import 'prismjs/themes/prism-okaidia.css';
import { PrismEditor } from 'vue-prism-editor';
import 'vue-prism-editor/dist/prismeditor.min.css';
-import { AiScript, parse, utils } from '@syuilo/aiscript';
+import { Interpreter, Parser, utils } from '@syuilo/aiscript';
import MkContainer from '@/components/MkContainer.vue';
import MkButton from '@/components/MkButton.vue';
import { createAiScriptEnv } from '@/scripts/aiscript/api';
@@ -36,6 +36,8 @@ import { $i } from '@/account';
import { i18n } from '@/i18n';
import { definePageMetadata } from '@/scripts/page-metadata';
+const parser = new Parser();
+
const code = ref('');
const logs = ref<any[]>([]);
@@ -50,7 +52,7 @@ watch(code, () => {
async function run() {
logs.value = [];
- const aiscript = new AiScript(createAiScriptEnv({
+ const aiscript = new Interpreter(createAiScriptEnv({
storageKey: 'scratchpad',
token: $i?.token,
}), {
@@ -84,7 +86,7 @@ async function run() {
let ast;
try {
- ast = parse(code.value);
+ ast = parser.parse(code.value);
} catch (error) {
os.alert({
type: 'error',
diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue
index 84d99d2fd7..b426ccfa0a 100644
--- a/packages/frontend/src/pages/settings/general.vue
+++ b/packages/frontend/src/pages/settings/general.vue
@@ -27,7 +27,6 @@
<FormSwitch v-model="imageNewTab" class="_formBlock">{{ i18n.ts.openImageInNewTab }}</FormSwitch>
<FormSwitch v-model="enableInfiniteScroll" class="_formBlock">{{ i18n.ts.enableInfiniteScroll }}</FormSwitch>
<FormSwitch v-model="useReactionPickerForContextMenu" class="_formBlock">{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch>
- <FormSwitch v-model="disablePagesScript" class="_formBlock">{{ i18n.ts.disablePagesScript }}</FormSwitch>
<FormSelect v-model="serverDisconnectedBehavior" class="_formBlock">
<template #label>{{ i18n.ts.whenServerDisconnected }}</template>
@@ -141,7 +140,6 @@ const disableShowingAnimatedImages = computed(defaultStore.makeGetterSetter('dis
const loadRawImages = computed(defaultStore.makeGetterSetter('loadRawImages'));
const imageNewTab = computed(defaultStore.makeGetterSetter('imageNewTab'));
const nsfw = computed(defaultStore.makeGetterSetter('nsfw'));
-const disablePagesScript = computed(defaultStore.makeGetterSetter('disablePagesScript'));
const showFixedPostForm = computed(defaultStore.makeGetterSetter('showFixedPostForm'));
const numberOfPageCache = computed(defaultStore.makeGetterSetter('numberOfPageCache'));
const instanceTicker = computed(defaultStore.makeGetterSetter('instanceTicker'));
diff --git a/packages/frontend/src/pages/settings/plugin.install.vue b/packages/frontend/src/pages/settings/plugin.install.vue
index 550bba242e..40ad9a95dd 100644
--- a/packages/frontend/src/pages/settings/plugin.install.vue
+++ b/packages/frontend/src/pages/settings/plugin.install.vue
@@ -14,8 +14,7 @@
<script lang="ts" setup>
import { defineAsyncComponent, nextTick, ref } from 'vue';
-import { AiScript, parse } from '@syuilo/aiscript';
-import { serialize } from '@syuilo/aiscript/built/serializer';
+import { Interpreter, Parser, utils } from '@syuilo/aiscript';
import { v4 as uuid } from 'uuid';
import FormTextarea from '@/components/form/textarea.vue';
import FormButton from '@/components/MkButton.vue';
@@ -26,23 +25,41 @@ import { unisonReload } from '@/scripts/unison-reload';
import { i18n } from '@/i18n';
import { definePageMetadata } from '@/scripts/page-metadata';
+const parser = new Parser();
const code = ref(null);
-function installPlugin({ id, meta, ast, token }) {
+function installPlugin({ id, meta, src, token }) {
ColdDeviceStorage.set('plugins', ColdDeviceStorage.get('plugins').concat({
...meta,
id,
active: true,
configData: {},
token: token,
- ast: ast,
+ src: src,
}));
}
async function install() {
+ if (code.value == null) return;
+
+ const lv = utils.getLangVersion(code.value);
+ if (lv == null) {
+ os.alert({
+ type: 'error',
+ text: 'No language version annotation found :(',
+ });
+ return;
+ } else if (lv !== '0.12.0') {
+ os.alert({
+ type: 'error',
+ text: `aiscript version '${lv}' is not supported :(`,
+ });
+ return;
+ }
+
let ast;
try {
- ast = parse(code.value);
+ ast = parser.parse(code.value);
} catch (err) {
os.alert({
type: 'error',
@@ -51,7 +68,7 @@ async function install() {
return;
}
- const meta = AiScript.collectMetadata(ast);
+ const meta = Interpreter.collectMetadata(ast);
if (meta == null) {
os.alert({
type: 'error',
@@ -103,7 +120,7 @@ async function install() {
name, version, author, description, permissions, config,
},
token,
- ast: serialize(ast),
+ src: code.value,
});
os.success();
diff --git a/packages/frontend/src/pages/settings/preferences-backups.vue b/packages/frontend/src/pages/settings/preferences-backups.vue
index 8b7548f25b..a713c1262d 100644
--- a/packages/frontend/src/pages/settings/preferences-backups.vue
+++ b/packages/frontend/src/pages/settings/preferences-backups.vue
@@ -62,7 +62,6 @@ const defaultStoreSaveKeys: (keyof typeof defaultStore['state'])[] = [
'loadRawImages',
'imageNewTab',
'disableShowingAnimatedImages',
- 'disablePagesScript',
'emojiStyle',
'disableDrawer',
'useBlurEffectForModal',
diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts
index 3a00cd0455..c19fe2b08d 100644
--- a/packages/frontend/src/plugin.ts
+++ b/packages/frontend/src/plugin.ts
@@ -1,16 +1,17 @@
-import { AiScript, utils, values } from '@syuilo/aiscript';
-import { deserialize } from '@syuilo/aiscript/built/serializer';
-import { jsToVal } from '@syuilo/aiscript/built/interpreter/util';
+import { Interpreter, Parser, utils, values } from '@syuilo/aiscript';
import { createAiScriptEnv } from '@/scripts/aiscript/api';
import { inputText } from '@/os';
import { noteActions, notePostInterruptors, noteViewInterruptors, postFormActions, userActions } from '@/store';
-const pluginContexts = new Map<string, AiScript>();
+const parser = new Parser();
+const pluginContexts = new Map<string, Interpreter>();
export function install(plugin) {
+ // 後方互換性のため
+ if (plugin.src == null) return;
console.info('Plugin installed:', plugin.name, 'v' + plugin.version);
- const aiscript = new AiScript(createPluginEnv({
+ const aiscript = new Interpreter(createPluginEnv({
plugin: plugin,
storageKey: 'plugins:' + plugin.id,
}), {
@@ -32,13 +33,13 @@ export function install(plugin) {
initPlugin({ plugin, aiscript });
- aiscript.exec(deserialize(plugin.ast));
+ aiscript.exec(parser.parse(plugin.src));
}
function createPluginEnv(opts) {
const config = new Map();
for (const [k, v] of Object.entries(opts.plugin.config || {})) {
- config.set(k, jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default));
+ config.set(k, utils.jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default));
}
return {
diff --git a/packages/frontend/src/scripts/hpml/evaluator.ts b/packages/frontend/src/scripts/hpml/evaluator.ts
index 196b3142a1..d4090ea15c 100644
--- a/packages/frontend/src/scripts/hpml/evaluator.ts
+++ b/packages/frontend/src/scripts/hpml/evaluator.ts
@@ -1,13 +1,11 @@
import autobind from 'autobind-decorator';
-import { PageVar, envVarsDef, Fn, HpmlScope, HpmlError } from '.';
-import { version } from '@/config';
-import { AiScript, utils, values } from '@syuilo/aiscript';
-import { createAiScriptEnv } from '../aiscript/api';
+import { markRaw, ref, Ref, unref } from 'vue';
import { collectPageVars } from '../collect-page-vars';
import { initHpmlLib, initAiLib } from './lib';
-import * as os from '@/os';
-import { markRaw, ref, Ref, unref } from 'vue';
import { Expr, isLiteralValue, Variable } from './expr';
+import { PageVar, envVarsDef, Fn, HpmlScope, HpmlError } from '.';
+import { version } from '@/config';
+import * as os from '@/os';
/**
* Hpml evaluator
@@ -16,7 +14,6 @@ export class Hpml {
private variables: Variable[];
private pageVars: PageVar[];
private envVars: Record<keyof typeof envVarsDef, any>;
- public aiscript?: AiScript;
public pageVarUpdatedCallback?: values.VFn;
public canvases: Record<string, HTMLCanvasElement> = {};
public vars: Ref<Record<string, any>> = ref({});
@@ -24,7 +21,6 @@ export class Hpml {
private opts: {
randomSeed: string; visitor?: any; url?: string;
- enableAiScript: boolean;
};
constructor(page: Hpml['page'], opts: Hpml['opts']) {
@@ -33,31 +29,6 @@ export class Hpml {
this.pageVars = collectPageVars(this.page.content);
this.opts = opts;
- if (this.opts.enableAiScript) {
- this.aiscript = markRaw(new AiScript({ ...createAiScriptEnv({
- storageKey: 'pages:' + this.page.id,
- }), ...initAiLib(this) }, {
- in: (q) => {
- return new Promise(ok => {
- os.inputText({
- title: q,
- }).then(({ canceled, result: a }) => {
- ok(a);
- });
- });
- },
- out: (value) => {
- console.log(value);
- },
- log: (type, params) => {
- },
- }));
-
- this.aiscript.scope.opts.onUpdated = (name, value) => {
- this.eval();
- };
- }
-
const date = new Date();
this.envVars = {
@@ -74,7 +45,7 @@ export class Hpml {
IS_CAT: opts.visitor ? opts.visitor.isCat : false,
SEED: opts.randomSeed ? opts.randomSeed : '',
YMD: `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`,
- AISCRIPT_DISABLED: !this.opts.enableAiScript,
+ AISCRIPT_DISABLED: true,
NULL: null,
};
@@ -100,13 +71,6 @@ export class Hpml {
}
@autobind
- public callAiScript(fn: string) {
- try {
- if (this.aiscript) this.aiscript.execFn(this.aiscript.scope.get(fn), []);
- } catch (err) {}
- }
-
- @autobind
public registerCanvas(id: string, canvas: any) {
this.canvases[id] = canvas;
}
@@ -116,9 +80,6 @@ export class Hpml {
const pageVar = this.pageVars.find(v => v.name === name);
if (pageVar !== undefined) {
pageVar.value = value;
- if (this.pageVarUpdatedCallback) {
- if (this.aiscript) this.aiscript.execFn(this.pageVarUpdatedCallback, [values.STR(name), utils.jsToVal(value)]);
- }
} else {
throw new HpmlError(`No such page var '${name}'`);
}
@@ -180,18 +141,6 @@ export class Hpml {
return scope.getState(expr.value);
}
- if (expr.type === 'aiScriptVar') {
- if (this.aiscript) {
- try {
- return utils.valToJs(this.aiscript.scope.get(expr.value));
- } catch (err) {
- return null;
- }
- } else {
- return null;
- }
- }
-
// Define user function
if (expr.type === 'fn') {
return {
diff --git a/packages/frontend/src/scripts/hpml/lib.ts b/packages/frontend/src/scripts/hpml/lib.ts
index b684876a7f..02d663b31b 100644
--- a/packages/frontend/src/scripts/hpml/lib.ts
+++ b/packages/frontend/src/scripts/hpml/lib.ts
@@ -1,9 +1,8 @@
import tinycolor from 'tinycolor2';
+import seedrandom from 'seedrandom';
import { Hpml } from './evaluator';
-import { values, utils } from '@syuilo/aiscript';
-import { Fn, HpmlScope } from '.';
import { Expr } from './expr';
-import seedrandom from 'seedrandom';
+import { Fn, HpmlScope } from '.';
/* TODO: https://www.chartjs.org/docs/latest/configuration/canvas-background.html#color
// https://stackoverflow.com/questions/38493564/chart-area-background-color-chartjs
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index 8e3e6b36da..4b1f47c2bc 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -170,10 +170,6 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: false,
},
- disablePagesScript: {
- where: 'device',
- default: false,
- },
emojiStyle: {
where: 'device',
default: 'twemoji', // twemoji / fluentEmoji / native
diff --git a/packages/frontend/src/widgets/aiscript.vue b/packages/frontend/src/widgets/aiscript.vue
index 4009edb8b8..dcc73db201 100644
--- a/packages/frontend/src/widgets/aiscript.vue
+++ b/packages/frontend/src/widgets/aiscript.vue
@@ -14,7 +14,7 @@
<script lang="ts" setup>
import { onMounted, onUnmounted, ref, watch } from 'vue';
-import { AiScript, parse, utils } from '@syuilo/aiscript';
+import { Interpreter, Parser, utils } from '@syuilo/aiscript';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget';
import { GetFormResultType } from '@/scripts/form';
import * as os from '@/os';
@@ -52,6 +52,8 @@ const { widgetProps, configure } = useWidgetPropsManager(name,
emit,
);
+const parser = new Parser();
+
const logs = ref<{
id: string;
text: string;
@@ -60,7 +62,7 @@ const logs = ref<{
const run = async () => {
logs.value = [];
- const aiscript = new AiScript(createAiScriptEnv({
+ const aiscript = new Interpreter(createAiScriptEnv({
storageKey: 'widget',
token: $i?.token,
}), {
@@ -94,7 +96,7 @@ const run = async () => {
let ast;
try {
- ast = parse(widgetProps.script);
+ ast = parser.parse(widgetProps.script);
} catch (err) {
os.alert({
type: 'error',
diff --git a/packages/frontend/src/widgets/button.vue b/packages/frontend/src/widgets/button.vue
index f0148d7f4e..f65b115cc0 100644
--- a/packages/frontend/src/widgets/button.vue
+++ b/packages/frontend/src/widgets/button.vue
@@ -8,7 +8,7 @@
<script lang="ts" setup>
import { onMounted, onUnmounted, ref, watch } from 'vue';
-import { AiScript, parse, utils } from '@syuilo/aiscript';
+import { Interpreter, Parser, utils } from '@syuilo/aiscript';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget';
import { GetFormResultType } from '@/scripts/form';
import * as os from '@/os';
@@ -48,8 +48,10 @@ const { widgetProps, configure } = useWidgetPropsManager(name,
emit,
);
+const parser = new Parser();
+
const run = async () => {
- const aiscript = new AiScript(createAiScriptEnv({
+ const aiscript = new Interpreter(createAiScriptEnv({
storageKey: 'widget',
token: $i?.token,
}), {
@@ -72,7 +74,7 @@ const run = async () => {
let ast;
try {
- ast = parse(widgetProps.script);
+ ast = parser.parse(widgetProps.script);
} catch (err) {
os.alert({
type: 'error',