🤖 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`.
106 lines
4.4 KiB
Markdown
106 lines
4.4 KiB
Markdown
---
|
|
title: Разработка модуля
|
|
weight: 1
|
|
---
|
|
|
|
**Цель:** добавить новую возможность в бота Quetza в виде изолированного модуля.
|
|
|
|
## 1. Проектирование модуля
|
|
|
|
Перед написанием кода выберите подходящую структуру модуля:
|
|
|
|
- **Простая команда:** достаточно каталога `commands/` (например, для служебных команд).
|
|
- **Реактивная логика:** нужен каталог `events/` для обработки событий Discord (например, приветственных сообщений).
|
|
- **Логика с состоянием:** понадобится контроллер (`Controller`) для управления состоянием между серверами (например, для музыкального плеера).
|
|
|
|
## 2. Структура каталогов
|
|
|
|
Создайте дерево каталогов модуля. Quetza автоматически найдёт и загрузит нужные файлы:
|
|
|
|
{{< filetree/container >}}
|
|
{{< filetree/folder name="src" state="open" >}}
|
|
{{< filetree/folder name="modules" state="open" >}}
|
|
{{< filetree/folder name="my-feature" state="open" >}}
|
|
{{< filetree/file name="module.ts" >}}
|
|
{{< filetree/folder name="commands" >}} {{< /filetree/folder >}}
|
|
{{< filetree/folder name="events" >}} {{< /filetree/folder >}}
|
|
{{< filetree/folder name="lib" >}} {{< /filetree/folder >}}
|
|
{{< /filetree/folder >}}
|
|
{{< /filetree/folder >}}
|
|
{{< /filetree/folder >}}
|
|
{{< /filetree/container >}}
|
|
|
|
## 3. Порядок реализации
|
|
|
|
{{% steps %}}
|
|
|
|
### Шаг 1: Манифест модуля
|
|
|
|
Создайте `module.ts` с описанием модуля:
|
|
|
|
```typescript
|
|
// src/modules/my-feature/module.ts
|
|
export const name = 'my-feature';
|
|
export const description = 'Добавляет крутые возможности';
|
|
// Опционально: export const controller = new MyFeatureController();
|
|
```
|
|
|
|
### Шаг 2: Команды
|
|
|
|
Создайте файлы команд в каталоге `commands/`. Каждый файл экспортирует описание команды и функцию выполнения (`execute`).
|
|
|
|
```typescript
|
|
// src/modules/my-feature/commands/ping.ts
|
|
import { SlashCommandBuilder } from 'discord.js';
|
|
|
|
export const data = new SlashCommandBuilder().setName('ping').setDescription('Отвечает Pong!');
|
|
|
|
export async function execute(interaction) {
|
|
await interaction.reply('Pong!');
|
|
}
|
|
```
|
|
|
|
### Шаг 3: Обработчики событий (опционально)
|
|
|
|
Создайте обработчики в каталоге `events/`, чтобы реагировать на события Discord:
|
|
|
|
```typescript
|
|
// src/modules/my-feature/events/ready.ts
|
|
import { Events } from 'discord.js';
|
|
|
|
export const name = Events.ClientReady;
|
|
export const once = true;
|
|
|
|
export function execute(client) {
|
|
console.log(`Ready! Logged in as ${client.user.tag}`);
|
|
}
|
|
```
|
|
|
|
### Шаг 4: Контроллер (опционально)
|
|
|
|
Если модулю нужно хранить состояние, создайте класс контроллера в каталоге `lib/` и экспортируйте его в `module.ts`.
|
|
|
|
### Шаг 5: Проверка
|
|
|
|
Перезапустите бота:
|
|
|
|
1. Найдите в логах строку «Loaded module: my-feature».
|
|
2. Убедитесь, что команда `/ping` появилась и работает в Discord.
|
|
|
|
{{% /steps %}}
|
|
|
|
## Шаблоны интеграции
|
|
|
|
| Шаблон | Назначение | Состав |
|
|
| :--- | :--- | :--- |
|
|
| **Простая команда** | Утилиты без сохранения состояния (`/ping`, бросок кубика) | Только `commands/` |
|
|
| **Сервис с состоянием** | Музыка, ролевые игры, экономика | `commands/` + `lib/Controller` |
|
|
| **Событийная логика** | Автомодерация, логирование | Только `events/` |
|
|
| **Гибридный модуль** | Сложные сценарии (например, ИИ-чат) | Все компоненты |
|
|
|
|
---
|
|
|
|
**См. также:**
|
|
|
|
- [Руководство Discord.js: слэш-команды](https://discordjs.guide/creating-your-bot/slash-commands.html)
|