plugins_message_null.js

import { DMessage } from '../../models/index.js';
import { FHelp } from '../../utils/index.js';
import { FBasePlugin } from '../base.js';

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

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

  /**
   * 与 type 对应的消息集合
   * @summary 消息集
   * @type {DMessageExtend[]}
   * @protected
   * @default []
   */
  _messages = [];

  /**
   * 既是消息提示的优先级, 也是插件的优先级
   * @summary 优先级
   * @protected
   * @type {number}
   * @default 2
   */
  _priority = 2;

  /**
   * 在安装插件时需要调用的函数, 一般用于初始化, 类型混合, 消息筛选以及事件绑定等等
   * @summary 安装插件
   * @param {ULive2dController} live2d live2d 上下文
   * @return {void}
   */
  install(live2d) {
    super.install(live2d);
    if (!this._enable) {
      return;
    }
    this.mixin();
    this._messages = this._live2d.tips.messages.filter(this.isType.bind(this));
    // 找到对应类型的消息, 并替换 condition 与 priority
    for (const message of this._messages) {
      message.condition = this.condition.bind(message);
      if (message.priority === DMessage.priority) {
        message.priority = this._priority;
      }
    }
  }

  /**
   * 在卸载插件时需要调用的函数, 一般用于销毁数据以及恢复消息默认值等等
   * @summary 卸载插件
   * @param {ULive2dController} live2d live2d 上下文
   * @return {void}
   */
  uninstall(live2d) {
    if (!this._enable) {
      return;
    }
    for (const message of this._messages) {
      this.setDefault(message);
    }
  }

  /**
   * 根据相关条件判断插件是否启用
   * @summary 是否启用插件
   * @return {boolean} true: 启用
   */
  isEnable() {
    return true;
  }

  /**
   * 判断消息类型是否与指定的类型相同
   * @summary 判断消息类型
   * @param {DMessageExtend} message 需需要判断的消息
   * @return {boolean} true: 相同
   */
  isType(message) {
    return this._type === (message.type ?? null) && message.condition === FHelp.T;
  }

  /**
   * 消息实例的判断函数, 用于判断是否显示消息
   * @summary 条件判断
   * @return {boolean} true: 可以显示该消息
   * @this DMessageExtend
   */
  condition() {
    return true;
  }

  /**
   * 卸载时恢复消息实例的默认值
   * @summary 恢复默认值
   * @param {DMessageExtend} message 消息实例
   */
  setDefault(message) {
    message.condition = FHelp.T;
    if (message.priority === this._priority) {
      message.priority = DMessage.priority;
    }
  }

  /**
   * 将一个类型混合到 `DMessage` 中
   * @summary 混合类型
   */
  mixin() {}
}