🤖 PR generated for branch `fix/cyrillic-fonts-dev-certs-and-page-head`.
### Changes Summary
- **Fonts**: Add Cyrillic glyph subsets for Lato, EB Garamond, and Fira
Code.
- **Dev**: Support remote Root CA and encrypted dev CA key in
`.env.dev`.
- **UI & Kits**: Add size variant to `Breadcrumbs` component and enlarge
`PageHead` breadcrumbs with tuned collapse scroll threshold.
- **ESLint**: Add `no-hanging-particles` i18n & markdown typography rule
with auto-fixer.
- **Content & i18n**: Apply `ru-text` editorial and typography polish
(em dashes, number ranges, «ё» restoration, non-breaking spaces) across
`services/www` and `services/docs`.
68 lines
3.2 KiB
Markdown
68 lines
3.2 KiB
Markdown
---
|
||
title: Модульная система
|
||
weight: 2
|
||
---
|
||
|
||
**Цель:** разобрать терминологию и механику работы базовой единицы Quetza — модуля.
|
||
|
||
## Терминология
|
||
|
||
### Объявление модуля (Module Declaration)
|
||
|
||
Файл `module.ts` служит манифестом и точкой входа при поиске модулей.
|
||
|
||
```typescript
|
||
export const name = 'my-module'; // ID
|
||
export const description = '...'; // Документация
|
||
```
|
||
|
||
### Регистрация команд (Command Registration)
|
||
|
||
Выполняется при наступлении события `ready`:
|
||
|
||
1. Quetza сканирует каталоги `commands/`.
|
||
2. Формирует структуру `ApplicationCommandData`.
|
||
3. Отправляет данные (PUT-запрос) в API Discord.
|
||
|
||
### Внедрение контроллера (Controller Injection)
|
||
|
||
Экземпляр контроллера передаётся аргументом при вызове (injected), а не импортируется модулем напрямую:
|
||
|
||
```typescript
|
||
// Фреймворк вызывает это:
|
||
execute(client, interaction, controller);
|
||
```
|
||
|
||
- **Зачем:** фреймворк берёт на себя управление жизненным циклом контроллера (один синглтон на модуль).
|
||
|
||
## Управление состоянием
|
||
|
||
### Эфемерность по умолчанию
|
||
|
||
В Quetza **нет встроенной базы данных**.
|
||
|
||
- **Память:** контроллеры сохраняют данные в стандартных JavaScript-коллекциях `Map` или `Set`.
|
||
- **Перезапуск:** при остановке процесса всё состояние в памяти сбрасывается.
|
||
- **Постоянное хранение:** если данные нужно сохранять между запусками, подключите внешнюю СУБД (например, SQLite или Redis) внутри контроллера.
|
||
|
||
### Область видимости как ключ
|
||
|
||
Ключи состояния должны соответствовать области его видимости:
|
||
|
||
- `Map<GuildID, ...>` — уровень сервера (основной сценарий).
|
||
- `Map<UserID, ...>` — уровень пользователя (боты для личных сообщений, DM).
|
||
|
||
## Модель обработки ошибок
|
||
|
||
**Быстрый и понятный отказ (Fail Fast & Friendly).**
|
||
|
||
- **Валидация:** проверяйте права и входные параметры сразу.
|
||
- **Сообщения для пользователя:** «У вас нет прав» вместо сухого кода вроде «Ошибка: 403».
|
||
- **Изоляция:** сбой внутри `/ping` перехватывается локально и не роняет процесс бота.
|
||
|
||
---
|
||
|
||
## См. также
|
||
|
||
- [Жизненный цикл взаимодействия Discord (Interaction Lifecycle)](https://discord.com/developers/docs/interactions/receiving-and-responding)
|