CloseSingleDirective.js 1.88 KB
Newer Older
xuchaozou's avatar
xuchaozou committed
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
import BaseDirective from "../BaseDirective";
import CloseMenuDirective from "./";
import {store, event} from '@wisdom-utils/utils'

class CloseSingleDirective extends BaseDirective {
    static name = '关闭菜单或者模糊匹配关闭菜单';

    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 CloseMenuDirective)) 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 widgets = this.getOpenedMenus();
        if (this.matchResult == 0 || this.matchResult > widgets.length) {
          this.data = {};
          this.data.type = 'widgets';
          this.data.widgets = widgets;
          return sendMsg(`索引超出了界限,请重新语音选择关闭第几个菜单`);
        }
        const menu = widgets[this.matchResult];
        event.emit('event:closeMenuByName', menu.name);
        return sendMsg(`关闭${menu.name}菜单成功`);
      }
    }
  
    getOpenedMenus() {
      const menus = store.get('event:openedMenus');
      return Array.from(menus.current.values());
    }
}

export default CloseSingleDirective