--- title: Начало работы weight: 1 --- **Quetza** — модульный фреймворк на TypeScript для Discord-ботов. Он позволяет собирать ботов из самодостаточных независимых модулей. ## Что такое Quetza? Quetza даёт архитектурный каркас, где разработка новой функциональности сводится к добавлению модулей, а не правке ядра. Это решает проблему жёсткой архитектуры за счёт инверсии зависимостей: ядро ничего не знает о модулях, а модули взаимодействуют с системой через типизированные контракты. ## Основная философия ### Проблема Традиционные монолитные боты хрупки: каждая новая функция требует правок в ядре, запутывает зависимости и раздувает кодовую базу, которую со временем становится сложно тестировать и поддерживать. ### Решение Quetza работает с модулями как с плагинами: - **Расширение без правки ядра:** добавьте каталог с модулем, и функция подключена. Менять исходный код ядра не нужно. - **Изоляция:** модули выполняются независимо друг от друга. - **Композиция:** подключайте и отключайте возможности, добавляя или удаляя каталоги модулей. ## Высокоуровневая архитектура Quetza состоит из трёх уровней: 1. **Базовый уровень (Foundation Layer):** клиент `Discord.js`, расширенный реестрами команд, событий и модулей. Выступает в роли сервис-локатора. 2. **Модульный уровень (Module Layer):** изолированные наборы функций. Модуль объявляет собственные команды и события через стандартизированную структуру файлов. 3. **Сервисный уровень (Service Layer):** контроллеры для управления состоянием бизнес-логики (например, аудиоплеером или контекстом диалога) на разных серверах (guilds). ## Ключевые концепции ### Ментальная модель При работе с Quetza полезна следующая аналогия: - **Модули — плагины:** независимые каталоги, обнаруживаемые во время запуска. - **Команды — эндпоинты:** обработчики без состояния, работающие аналогично конечным точкам REST API. - **События — наблюдатели (observers):** реактивная логика, подписанная на события жизненного цикла Discord. - **Контроллеры — сервисы:** менеджеры состояния, связывающие команды без состояния с долговременной логикой бота. ### Границы системы Ограничения, которые важно учитывать при проектировании: - **Нет встроенного постоянного хранилища (persistence):** состояние в памяти сбрасывается при перезапуске. Для долговременного хранения нужна внешняя база данных. - **Нет межмодульного взаимодействия:** модули не вызывают друг друга напрямую, что гарантирует слабую связанность. - **Нет динамической перезагрузки:** модули загружаются один раз при старте процесса. ## Архитектурные инварианты Quetza ставит предсказуемость выше избыточной гибкости за счёт строгих соглашений: - **Обнаружение по соглашениям:** чтобы модуль загрузился, структура его каталога _обязана_ содержать `module.ts`, `commands/` и `events/`. - **Однофазная инициализация:** все модули загружаются до установки соединения с Discord. - **Соблюдение контрактов:** команды и события должны экспортировать типизированные интерфейсы, необходимые для регистрации. --- ## См. также - [Документация Discord.js](https://discord.js.org/) - [Документация TypeScript](https://www.typescriptlang.org/)