plugins_message_event_event.js

import { DMessage } from '../../../models/index.js';
import { FHelp } from '../../../utils/index.js';
import { FNullMessagePlugin } from '../null.js';

/**
 * @class
 * @summary 事件消息
 * @classdesc 与事件相关的消息数据类
 * @memberof module:plugins
 * @alias DEventMessage
 * @mixin
 */
export class DEventMessage {
  /**
   * 指定的事件类型, 例如 `copy`, `console` 等等
   * @summary 事件
   * @type {?string}
   * @default null
   */
  event = null;
}

/**
 * @class
 * @summary 事件消息
 * @classdesc 事件类型的消息提示插件
 * @hideconstructor
 * @abstract
 * @extends {FNullMessagePlugin}
 * @memberof module:plugins
 * @alias FEventMessagePlugin
 */
export class FEventMessagePlugin extends FNullMessagePlugin {
  /**
   * 插件名称必须是唯一的, 如果有重复的名称, 则后面的插件将不会安装
   * @summary 插件名称
   * @protected
   * @type {string}
   * @default 'eventMessage'
   */
  _name = 'eventMessage';

  /**
   * @default 'event'
   * @override
   */
  _type = 'event';

  /**
   * @default 18
   * @override
   */
  _priority = 18;

  /**
   * 消息数据的事件对应的类型
   * @summary 事件类型
   * @type {?string}
   * @default null
   * @protected
   */
  _event = null;

  /**
   * 以键值对进行记录的对象引用
   * @summary 对象引用
   * @type {Record<string, any>}
   * @default {}
   * @protected
   */
  _ref = {};

  /**
   * @override
   */
  install(live2d) {
    super.install(live2d);
    this.addListener();
  }

  /**
   * @override
   */
  uninstall(live2d) {
    super.uninstall(live2d);
    this.removeListener();
  }

  /**
   * @override
   */
  isType(message) {
    return super.isType(message) && this._event === (message.event ?? null);
  }

  /**
   * @override
   * @this DMessageExtend
   */
  condition() {
    return false;
  }

  /**
   * @override
   */
  mixin() {
    FHelp.mixin(DMessage, DEventMessage);
  }

  /**
   * @override
   */
  setDefault(message) {
    super.setDefault(message);
    message.condition = FHelp.F;
  }

  /**
   * 添加 event 对应的事件监听
   * @summary 添加事件
   * @abstract
   */
  addListener() {}

  /**
   * 移除 event 对应的事件监听
   * @summary 移除监事件
   * @abstract
   */
  removeListener() {}

  /**
   * 立即通知对应的事件消息
   * @summary 通知消息
   * @async
   */
  async notify() {
    // 通知对应的消息
    let messages = this._messages;
    if (messages.length <= 0) return;
    let message = messages[FHelp.random(0, messages.length, 'floor')];
    let text = '';
    if (FHelp.is(Array, message.text)) {
      text = message.text[FHelp.random(0, message.text.length, 'floor')];
    }
    else {
      text = message.text;
    }
    await this._live2d.tips.notify(text);
  }
}