umbot
    Preparing search index...

    Модель для работы с пользовательскими данными. Предоставляет единый интерфейс для работы с данными пользователей во всех поддерживаемых платформах.

    Основные возможности:

    • Сохранение состояния пользователя между сессиями
    • Хранение метаданных (например, статистика использования)
    • Поддержка как файлового хранилища, так и БД
    • Автоматическая сериализация/десериализация данных

    Сохранение прогресса пользователя (через addCommand — колбэк фреймворк ожидает):

    import { UsersData } from 'umbot';

    interface IGameProgress {
    progress?: number;
    }

    bot.addCommand('progress', ['прогресс'], async (_text, ctx) => {
    // Загрузка данных пользователя
    const userData = new UsersData(ctx.appContext);
    userData.userId = ctx.userId;

    if (await userData.getOne()) {
    // data может быть string | Record<string,unknown> | null — сужаем тип
    const data = userData.data as IGameProgress | null;
    const progress = data?.progress ?? 0;
    ctx.text = `Ваш текущий прогресс: ${progress}%`;
    } else {
    userData.data = { progress: 0 };
    userData.meta = { firstVisit: new Date().toISOString() };
    await userData.save();
    ctx.text = 'Добро пожаловать в игру!';
    }
    });

    Работа с разными платформами:

    import { T_ALISA, T_TELEGRAM } from 'umbot/plugins';

    const userData = new UsersData(appContext);

    // Для Алисы
    userData.platform = T_ALISA;

    // Для Telegram
    userData.platform = T_TELEGRAM;

    Hierarchy (View Summary)

    Index

    Constructors

    • Создает экземпляр модели пользовательских данных. Предоставляет унифицированный интерфейс для хранения данных пользователя.

      Parameters

      • appContext: AppContext

        Контекст приложения

      Returns UsersData

      const userData = new UsersData(appContext);
      userData.userId = 'user123';
      userData.platform = 'telegram';

    Properties

    _appContext: AppContext

    Контекст приложения.

    queryData: IQuery

    Объект для хранения параметров запроса. Содержит условия поиска и данные для обновления

    startIndex: number = 0

    Начальный индекс для итерации по данным. Используется при инициализации модели из массива

    state: Partial<TState> = {}

    Состояние модели. Содержит текущие значения всех атрибутов

    // Установка значений
    this.state.username = 'John';
    this.state.age = 25;

    // Получение значений
    console.log(this.state.username);
    TABLE_NAME: "UsersData" = 'UsersData'

    Название таблицы для хранения данных пользователей.

    Accessors

    • get data(): TDataType

      Основные данные пользователя. Содержит основное состояние пользователя, например:

      • Прогресс в игре
      • Сохраненные настройки
      • История действий
      • Другие пользовательские данные

      Returns TDataType

      При сохранении в БД автоматически преобразуется в JSON строку

    • set data(data: TDataType): void

      Устанавливает основные данные пользователя.

      Parameters

      • data: TDataType

        Основные данные пользователя

      Returns void

    • get meta(): TMetaType

      Метаданные пользователя. Может содержать любые дополнительные данные о пользователе, такие как:

      • Статистика использования
      • Временные метки
      • Настройки пользователя
      • Дополнительная информация

      Returns TMetaType

      При сохранении в БД автоматически преобразуется в JSON строку

    • set meta(meta: TMetaType): void

      Устанавливает метаданные пользователя.

      Parameters

      • meta: TMetaType

        Метаданные пользователя

      Returns void

    • get platform(): string

      Тип платформы пользователя. Определяет платформу, с которой работает пользователь.

      Returns string

    • set platform(platform: string): void

      Тип платформы пользователя. Определяет платформу, с которой работает пользователь.

      Parameters

      • platform: string

      Returns void

    • get userId(): string | number | null | undefined

      Уникальный идентификатор пользователя. Может быть строкой или числом в зависимости от платформы.

      Returns string | number | null | undefined

      "123456789" для Telegram (строка), 123456789 для VK (число)
      
    • set userId(userId: string | number | null): void

      Устанавливает уникальный идентификатор пользователя.

      Parameters

      • userId: string | number | null

        Идентификатор пользователя

      Returns void

    Methods

    • Добавляет новую запись в базу данных

      Returns Promise<boolean>

      Promise с результатом операции

      model.state.name = 'John';
      await model.add();
    • Закрывает соединение с базой данных

      Returns void | Promise<void>

      model.destroy();
      
    • Экранирует специальные символы в строке

      Parameters

      • text: string | number

        Строка или число для экранирования

      Returns string

      Экранированная строка

      const safe = model.escapeString("O'Connor");
      
    • Ищет одну запись в хранилище по первичному ключу userId (platform/meta в поиске не участвуют — фильтруйте результат сами при необходимости).

      Returns Promise<boolean>

      true, если запись найдена

      const userData = new UsersData(appContext);
      userData.userId = 'user123';
      if (await userData.getOne()) {
      // data может быть string | Record<string,unknown> | null | undefined:
      // сужаем тип перед чтением полей
      const progress = (userData.data as Record<string, unknown>)?.progress;
      console.log('Пользователь найден, прогресс:', progress);
      } else {
      console.log('Пользователь не найден');
      }
    • Инициализирует модель данными. Преобразует JSON строки meta и data в объекты при загрузке из БД.

      Parameters

      • data: IDbResult<unknown> | IDbResult<unknown>[] | null

        Данные для инициализации

      Returns void

      • При парсинге data, ошибки игнорируются для обеспечения обратной совместимости
      • meta парсится только если это JSON-строка, начинающаяся с "{" или "["; data парсируется всегда, когда это строка (без проверки первого символа)
      const userData = new UsersData(appContext);
      userData.init({
      userId: 'user123',
      meta: '{"lastVisit":"2024-03-20T12:00:00Z"}',
      data: '{"progress":75}',
      platform: T_TELEGRAM
      });
      // init() распарсила JSON-строки meta и data в объекты
      console.log((userData.meta as { lastVisit?: string }).lastVisit); // строка '2024-03-20T12:00:00Z' (JSON.parse не создаёт Date)
      console.log(userData.data.progress); // 75
    • Проверяет состояние подключения к базе данных

      Returns boolean | Promise<boolean>

      true если подключение активно (синхронно false без адаптера БД, иначе Promise от адаптера)

      const isConnected = await model.isConnected();
      if (isConnected) {
      // Выполнение операций с базой данных
      }
    • Выполняет произвольный запрос к базе данных

      Типы client/db зависят от подключённого адаптера БД — для MongoAdapter это MongoClient и Db из драйвера mongodb. Для FileAdapter _query не реализован — метод вернёт null.

      Parameters

      • callback: TQueryCb

        Функция обратного вызова для выполнения запроса

      Returns unknown

      Результат выполнения запроса

      import type { MongoClient, Db } from 'mongodb';

      const result = await model.query(async (client: MongoClient, db: Db) => {
      const collection = db.collection('users');
      return await collection.aggregate([
      { $match: { age: { $gt: 18 } } },
      { $group: { _id: '$city', count: { $sum: 1 } } }
      ]).toArray();
      });
    • Удаляет запись из базы данных

      Returns Promise<boolean>

      Promise - true если удаление успешно

      await model.remove();
      
    • Сохраняет данные модели в базу данных Если запись существует - обновляет, иначе создает новую

      Parameters

      • isNew: boolean = false

        Флаг создания новой записи

      Returns Promise<boolean>

      Promise с результатом операции

      model.state.name = 'John';
      await model.save(); // Обновление существующей записи
      await model.save(true); // Создание новой записи
    • Выполняет поиск записи по первичному ключу

      Returns Promise<ISelectOneModelRes>

      Promise с результатом запроса

      const result = await model.selectOne();
      if (result.status) {
      model.init(result.data ?? null); // data опционален, init() допускает null
      }
    • Возвращает название таблицы/файла для хранения данных.

      Returns string

      Название таблицы для хранения данных пользователей

    • Обновляет существующую запись в базе данных

      Returns Promise<boolean>

      Promise с результатом операции

      model.state.name = 'John';
      await model.update();
    • Валидирует значения перед сохранением. Преобразует объекты meta и data в JSON при сохранении в БД.

      Returns void

      Не выбрасывает исключений: циклические ссылки в meta/data автоматически заменяются на '[Circular]'.

      userData.meta = { lastVisit: new Date() };
      userData.data = { progress: 75 };
      userData.validate(); // meta и data будут преобразованы в JSON
    • Выполняет произвольный запрос к базе данных

      Parameters

      • where: string | IQueryData = '1'

        Условия запроса

      • isOne: boolean = false

        Флаг выборки одной записи

      Returns Promise<IModelRes<IDataValue>>

      Promise с результатом запроса

      // Объект условий — точные значения полей
      const res = await model.where({ age: 25 });

      // Строка условий формата getQueryData
      const res2 = await model.where('`age`=25 `status`="active"');
    • Выполняет запрос с выборкой одной записи

      Parameters

      • where: string | IQueryData = '1'

        Условия запроса

      Returns Promise<boolean>

      Promise - true если запись найдена

      const found = await model.whereOne({ id: 1 });
      if (found) {
      console.log('Запись найдена');
      }