Source

types/index.ts

import { Command, UtilsCore } from '../main';

export interface Context extends Record<string, unknown> {
  text?: string;
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  [key: string]: any;
}

export interface IContext {
  $command?: string;
  body?: RegExpMatchArray;
}

/**
 * @typedef {Function}
 * @example
 *
 * handler(context, bot) {
 *  bot.testMetod() //utils.testMetod
 *  context.send('ура')
 * }
 */
export type THandlerCommand = (
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  context: any,
  bot: UtilsCore,
) => unknown | Promise<unknown>;

/**
 * @interface
 */
export interface ICommand {
  /**
   * @type {RegExp | string} регулярное выражение
   */
  pattern: RegExp | string;

  /**
   * @type {string} название команды
   */
  name?: string;

  /**
   * @type {string} краткое описание команды
   * @default ''
   */
  description?: string;

  /**
   * @type {string[]} категории команды
   * @default []
   */
  categories?: string[];

  /**
   * @type {Record<string, unknown>} дополнительные параметры
   * @default {}
   */
  params?: Record<string, unknown>;

  /**
   * @type {Command[]} массив подкоманд
   * @default []
   */
  commands?: Command[];

  /**
   * @type {THandlerCommand} функция обработки
   */
  handler: THandlerCommand;
}

/**
 * @typedef {Function}
 */
// eslint-disable-next-line
type TEmit = (eventName: string | symbol, ...args: any) => boolean;

/**
 * @typedef {Function}
 */
type TOn = (
  eventName: string | symbol,
  // eslint-disable-next-line
  listener: (...args: any) => any,
) => EventEmitter;

/**
 * @typedef {Function}
 */
type TEventNames = () => Array<string>;

/**
 * @interface
 */
export interface EventEmitter {
  /**
   * @description
   * Синхронно вызывает каждого из прослушивателей, зарегистрированных для указанного события ```eventName```,
   * в том порядке, в котором они были зарегистрированы, передавая каждому предоставленные аргументы.
   * @type {TEmit}
   */
  emit: TEmit;

  /**
   * @description Добавляет ```listener``` функцию в конец массива слушателей для названного события eventName.
   * @type {TOn}
   */
  on: TOn;

  /**
   * @description
   * Возвращает массив со списком событий, для которых эмиттер зарегистрировал слушателей.
   * Значения в массиве - это строки или ```Symbols```.
   * @type {TEventNames}
   */
  eventNames: TEventNames;
}