import BaseDirective from "../BaseDirective"; import OpenMenuDirective from "./"; import { cut, extract } from '@congcongcai/jieba.js' import Utils from "../../utils/Utils"; class OpenSingleDirective extends BaseDirective { match() { const { text } = this let result = null if (this.getBeforeLastGroupDirective()) { result = text.match(/第([一|二|三|四|五|六|七|八|九|十]+)个/) if (result && result.length >= 2) { this.matchResult = Utils.chineseToNumber(result[1]) } else if (!result) { result = text.match(/第[\u4e00-\u9fa5]?(\d+)个/) if (result && result.length >= 2) { this.matchResult = Number(result[1]) } } } return !!this.matchResult } getBeforeLastGroupDirective () { const lastMenu = this.directives.at(-1) if(!lastMenu) return false if(!(lastMenu instanceof OpenMenuDirective || lastMenu instanceof this.openSingleMenu) ) return false if(!lastMenu.data || lastMenu.data.type != "widgets" || lastMenu.data.widgets.length == 0) return false return true } async excute({ sendMsg = function () { } }) { if(typeof this.matchResult == "number") { const lastMenu = this.directives.at(-2) const widgets = lastMenu.data.widgets if(this.matchResult == 0 || this.matchResult > widgets.length) { this.data = {} this.data.type = "widgets" this.data.widgets = widgets return sendMsg(`索引超出了界限,请重新语音选择第几个菜单`) } else { const currentMenu = widgets[this.matchResult - 1] if(currentMenu.url) { this.openSingleMenu(currentMenu) return sendMsg(`成功打开${currentMenu.label}菜单`) } else { this.data = {} this.data.type = "widgets" this.data.widgets = currentMenu.widgets return sendMsg(this.widgetsToMsg(currentMenu.widgets)) } } } return sendMsg("打开菜单失败") } getCompleteMenus() { const result = Utils.findMenus({ name: this.matchResult }) const { widgets } = result return widgets.length > 0 ? widgets : null } widgetsToMsg (widgets) { return `有以下${widgets.length}个菜单\n${widgets.map((widget, index) => `${index + 1}.${widget.label}${widget.widgets ? "(菜单组)" : ""}`).join("\n")}\n请语音确认一下打开第几个菜单` } getPatternMenus() { const weights = extract(this.matchResult, 4) let data = [] if (weights.length == 0) return null weights.map(({ word }) => { const name = new RegExp(word) const result = Utils.findMenus({ name }) if(result.widgets.length > 0) { data = data.concat(result.widgets) } }) data = uniq(data) return data.length > 0 ? data : null } openSingleMenu(widget) { Utils.openMenu({widget}) } } export default OpenSingleDirective