OpenSingleDirective.js 3.29 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
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