umbot
Version:
Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф
723 lines (722 loc) • 17.3 kB
TypeScript
import { IVkCard } from '../../VK/interfaces/IVkPlatform';
/**
* Тип идентификатора получателя в VK
* - string: для публичных страниц и групп
* - number: для пользователей и чатов
*/
export type TVkPeerId = string | number;
/**
* Тип документа в VK
* - doc: обычный документ
* - audio_message: голосовое сообщение
* - graffiti: граффити
*/
export type TVkDocType = 'doc' | 'audio_message' | 'graffiti';
/**
* Базовый интерфейс для ответов от VK API
*
* @example
* ```ts
* // Успешный ответ
* const successResponse: IVkApi<{id: number}> = {
* response: { id: 123456789 }
* };
*
* // Ответ с ошибкой
* const errorResponse: IVkApi = {
* error: "Invalid request"
* };
* ```
*/
export interface IVkApi<T = Record<string, unknown> | unknown> {
/**
* Ошибка, если таковая имеется
*/
error?: string;
/**
* Ответ от API
*/
response?: T;
}
/**
* Интерфейс для загрузки файла в VK
*
* @example
* ```ts
* const uploadFile: IVkUploadFile = {
* file: "/path/to/file.jpg",
* photo: "photo123456789_987654321",
* server: "123456",
* hash: "abcdef123456789"
* };
* ```
*/
export interface IVkUploadFile extends IVkApi {
/**
* Путь к файлу
*/
file: string;
/**
* Путь к фотографии
*/
photo: string;
/**
* Сервер для загрузки
*/
server: string;
/**
* Хэш для проверки загрузки
*/
hash: string;
}
/**
* Интерфейс для параметров метода users.get в VK API
*
* @example
* ```ts
* const params: IVkParamsUsersGet = {
* user_ids: ["123456789", "durov"],
* fields: ["photo_200", "status", "online"],
* name_case: "nom"
* };
* ```
*/
export interface IVkParamsUsersGet {
/**
* ID пользователей или короткие адреса
* По умолчанию - ID текущего пользователя
*/
user_ids: string[];
/**
* Поля профиля для получения
* Возможные значения: nickname, screen_name, sex, bdate, city, country, timezone, photo, photo_medium, photo_big, has_mobile, contacts, education, online, counters, relation, last_seen, activity, can_write_private_message, can_see_all_posts, can_post, universities
*/
fields: string[];
/**
* Падеж для склонения имени и фамилии
* nom - именительный (по умолчанию)
* gen - родительный
* dat - дательный
* acc - винительный
* ins - творительный
* abl - предложный
*/
name_case: string;
}
/**
* Интерфейс для параметров метода messages.send в VK API
*
* @example
* ```ts
* // Отправка текстового сообщения
* const textMessage: IVkParams = {
* peer_id: 123456789,
* message: "Hello, world!",
* random_id: 123456789
* };
*
* // Отправка сообщения с вложениями
* const messageWithAttachments: IVkParams = {
* peer_id: 123456789,
* attachments: ["photo123456789_987654321", "doc123456789_987654321"],
* random_id: 123456789
* };
*
* // Отправка сообщения с клавиатурой
* const messageWithKeyboard: IVkParams = {
* peer_id: 123456789,
* message: "Choose an option:",
* keyboard: {
* one_time: true,
* buttons: [
* [
* {
* action: {
* type: "text",
* label: "Button 1"
* }
* }
* ]
* ]
* },
* random_id: 123456789
* };
* ```
*/
export interface IVkParams {
/**
* ID пользователя
* По умолчанию - текущий пользователь
*/
user_id?: number;
/**
* Уникальный идентификатор для избежания повторной отправки сообщения
*/
random_id?: number;
/**
* ID получателя
* Для пользователя: ID пользователя
* Для чата: 2000000000 + ID чата
* Для сообщества: -ID сообщества
*/
peer_id?: number;
/**
* Короткий адрес пользователя
* Например, 'illarionov'
*/
domain?: string;
/**
* ID беседы
*/
chat_id?: number;
/**
* ID получателей сообщения.
* Используется при создании новой беседы
*/
user_ids?: number[];
/**
* Текст сообщения.
* Обязателен, если не указаны вложения
*/
message?: string;
/**
* Географическая широта
* От -90 до 90 градусов
*/
lat?: number;
/**
* Географическая долгота
* От -180 до 180 градусов
*/
long?: number;
/**
* Список вложений
* Обязателен, если не указан текст сообщения
* Формат: "<owner_id>_<media_id>"
* Пример: "photo100172_166443618"
*/
attachments?: string[];
/**
* ID сообщения, на которое отвечаем
*/
reply_to?: number;
/**
* ID пересылаемых сообщений.
* Разделяются запятой.
* Пример: "123,431,544"
*/
forward_messages?: number[];
/**
* Параметры пересылки
*/
forward?: string;
/**
* ID стикера
*/
sticker_id?: number;
/**
* ID группы.
* Для сообщений от имени группы
*/
group_id?: number;
/**
* Клавиатура
*/
keyboard?: string | object;
/**
* Полезная нагрузка
*/
payload?: string;
/**
* Отключить разбор ссылок
*/
dont_parse_links?: boolean;
/**
* Отключить упоминания
*/
disable_mentions?: boolean;
/**
* Шаблон сообщения
*/
template?: string[] | IVkCard | string;
}
/**
* Интерфейс для идентификаторов пользователей
*
* @example
* ```ts
* const userIds: IVkUsersIds = {
* peer_id: 123456789,
* message_id: 987654321
* };
* ```
*/
export interface IVkUsersIds {
/**
* ID получателя
*/
peer_id?: number;
/**
* ID сообщения
*/
message_id?: number;
/**
* Ошибка, если таковая имеется
*/
error?: unknown;
}
/**
* Интерфейс для отправки сообщения в VK
*
* @example
* ```ts
* const sendMessage: IVKSendMessage = {
* response: 123456789,
* user_ids: [
* {
* peer_id: 123456789,
* message_id: 987654321
* }
* ]
* };
* ```
*/
export interface IVKSendMessage extends IVkApi<number> {
/**
* Массив идентификаторов пользователей
*/
user_ids?: IVkUsersIds[];
}
/**
* Интерфейс для информации о пользователе в VK
*
* @example
* ```ts
* const user: IVkUsersGet = {
* id: 123456789,
* first_name: "John",
* last_name: "Doe",
* is_closed: false,
* can_access_closed: true
* };
* ```
*/
export interface IVkUsersGet extends IVkApi {
/**
* ID пользователя
*/
id: number;
/**
* Имя пользователя
*/
first_name: string;
/**
* Фамилия пользователя
*/
last_name: string;
/**
* Статус страницы
* Возвращается, если страница удалена или заблокирована
*/
deactivated?: string;
/**
* Скрыт ли профиль настройками приватности
*/
is_closed: boolean;
/**
* Может ли текущий пользователь видеть профиль
* Актуально при is_closed = 1
*/
can_access_closed: boolean;
}
/**
* Интерфейс для сервера загрузки фотографий в VK
*
* @example
* ```ts
* const uploadServer: IVkUploadServer = {
* response: {
* upload_url: "{UPLOAD_URL}",
* album_id: "123456789",
* group_id: "987654321"
* }
* };
* ```
*/
export interface IVkUploadServer extends IVkApi {
/**
* Адрес сервера для загрузки
*/
upload_url: string;
/**
* ID альбома
*/
album_id?: string;
/**
* ID сообщества
*/
group_id?: string;
}
/**
* Интерфейс для сохранения фотографии в VK
*
* @example
* ```ts
* const savedPhoto: IVkPhotosSave = {
* response: [{
* id: 123456789,
* pid: 987654321,
* aid: 123456,
* owner_id: 123456789,
* src: "/photo123456789_987654321",
* src_big: "/photo123456789_987654321_big",
* src_small: "/photo123456789_987654321_small",
* created: 1234567890,
* src_xbig: "/photo123456789_987654321_xbig",
* src_xxbig: "/photo123456789_987654321_xxbig"
* }]
* };
* ```
*/
export interface IVkPhotosSave extends IVkApi {
/**
* ID изображения
*/
id: number;
/**
* ID изображения
*/
pid: number;
/**
* ID альбома
*/
aid: number;
/**
* ID владельца изображения
*/
owner_id: number;
/**
* URL изображения
*/
src: string;
/**
* URL большой версии изображения
*/
src_big: string;
/**
* URL маленькой версии изображения
*/
src_small: string;
/**
* Дата загрузки
* Unix timestamp
*/
created: number;
/**
* URL очень большой версии изображения
*/
src_xbig: string;
/**
* URL максимально большой версии изображения
*/
src_xxbig: string;
}
/**
* Базовый интерфейс для информации о документе
*
* @example
* ```ts
* const docInfo: IVkDocInfo = {
* id: 123456789,
* owner_id: 987654321
* };
* ```
*/
interface IVkDocInfo {
/**
* ID документа
*/
id: number;
/**
* ID владельца документа
*/
owner_id: number;
}
/**
* Интерфейс для информации о граффити
*
* @example
* ```ts
* const graffiti: IVkGraffiti = {
* id: 123456789,
* owner_id: 987654321,
* url: "/doc123456789_987654321",
* width: 800,
* height: 600
* };
* ```
*/
export interface IVkGraffiti extends IVkDocInfo {
/**
* URL документа
*/
url: string;
/**
* Ширина изображения
*/
width: number;
/**
* Высота изображения
*/
height: number;
}
/**
* Интерфейс для информации о голосовом сообщении
*
* @example
* ```ts
* const audioMessage: IVkAudioMessageInfo = {
* duration: 30,
* waleform: [0, 1, 2, 3, 4, 5],
* link_ogg: "{...}.ogg",
* link_mp3: "{...}.mp3"
* };
* ```
*/
export interface IVkAudioMessageInfo {
/**
* Длительность в секундах
*/
duration: number;
/**
* Массив значений для визуализации звука
*/
waleform: number[];
/**
* URL .ogg файла
*/
link_ogg?: string;
/**
* URL .mp3 файла
*/
link_mp3?: string;
}
/**
* Интерфейс для голосового сообщения
*
* @example
* ```ts
* const audioMessage: IVkAudioMessage = {
* id: 123456789,
* owner_id: 987654321,
* duration: 30,
* waleform: [0, 1, 2, 3, 4, 5],
* link_ogg: "/audio_message123456789_987654321.ogg",
* link_mp3: "/audio_message123456789_987654321.mp3"
* };
* ```
*/
export interface IVkAudioMessage extends IVkDocInfo, IVkAudioMessageInfo {
}
/**
* Интерфейс для предпросмотра документа
*
* @example
* ```ts
* const preview: IVkPreview = {
* photo: [
* "/photo123456789_987654321_s",
* "/photo123456789_987654321_m",
* "/photo123456789_987654321_x"
* ],
* graffiti: {
* src: "/graffiti123456789_987654321",
* width: 800,
* height: 600
* },
* audio_message: {
* duration: 30,
* waleform: [0, 1, 2, 3, 4, 5],
* link_ogg: "/audio_message123456789_987654321.ogg",
* link_mp3: "/audio_message123456789_987654321.mp3"
* }
* };
* ```
*/
export interface IVkPreview {
/**
* Массив копий изображения
* Подробное описание структуры см в документации
* @see https://vk.ru/dev/objects/photo_sizes
*/
photo?: string[];
/**
* Данные о граффити
*/
graffiti?: {
/**
* URL документа с граффити
*/
src: string;
/**
* Ширина изображения
*/
width: number;
/**
* Высота изображения
*/
height: number;
};
/**
* Данные о голосовом сообщении
*/
audio_message?: IVkAudioMessageInfo;
}
/**
* Интерфейс для документа
*
* @example
* ```ts
* const doc: IVKDoc = {
* id: 123456789,
* owner_id: 987654321,
* url: "/doc123456789_987654321",
* title: "document.pdf",
* size: 1024,
* ext: "pdf",
* date: 1234567890,
* type: 1,
* preview: {
* photo: [
* "/photo123456789_987654321_s",
* "/photo123456789_987654321_m",
* "/photo123456789_987654321_x"
* ]
* }
* };
* ```
*/
export interface IVKDoc extends IVkDocInfo {
/**
* URL документа
*/
url: string;
/**
* Название документа
*/
title: string;
/**
* Размер в байтах
*/
size: number;
/**
* Расширение файла
*/
ext: string;
/**
* Дата добавления
* Unix timestamp
*/
date: number;
/**
* Тип документа
* 1 - текстовый документ
* 2 - архивы
* 3 - gif
* 4 - изображения
* 5 - аудио
* 6 - видео
* 7 - электронные книги
* 8 - неизвестно
*/
type: number;
/**
* Данные для предпросмотра
*/
preview: IVkPreview;
}
/**
* Интерфейс для сохранения документа
*
* @example
* ```ts
* const savedDoc: IVkDocSave = {
* response: {
* type: "doc",
* id: 123456789,
* owner_id: 987654321,
* url: "/doc123456789_987654321",
* title: "document.pdf",
* size: 1024,
* ext: "pdf",
* date: 1234567890,
* type: 1,
* preview: {
* photo: [
* "/photo123456789_987654321_s",
* "/photo123456789_987654321_m",
* "/photo123456789_987654321_x"
* ]
* }
* }
* };
* ```
*/
export interface IVkDocSave extends IVkDocInfo, IVkApi {
/**
* Тип документа
*/
type: TVkDocType;
/**
* Данные о граффити
*/
graffiti?: IVkGraffiti;
/**
* Данные о голосовом сообщении
*/
audio_message?: IVkAudioMessage;
/**
* Данные о документе
*/
doc?: IVKDoc;
/**
* ID документа
*/
id: number;
/**
* URL документа
* Для граффити и документа
*/
url: string;
/**
* Ширина изображения
* Для граффити
*/
width?: number;
/**
* Высота изображения
* Для граффити
*/
height?: number;
/**
* Длительность в секундах
* Для голосового сообщения
*/
duration?: number;
/**
* Массив значений для визуализации звука
* Для голосового сообщения
*/
waleform?: number[];
/**
* URL .ogg файла
* Для голосового сообщения
*/
link_ogg?: string;
/**
* URL .mp3 файла
* Для голосового сообщения
*/
link_mp3?: string;
}
export {};