fix: PageHead header alignment, analytics proxy, and infra improvements (#64)

🤖 Pull request created from `various-fixes` containing PageHead
breadcrumbs and navigation alignment fixes, Umami analytics proxy, and
infrastructure updates.
This commit is contained in:
deytenit authored and GitHub committed 2026-10-24 16:52:49 +03:00
1 parent ff5a50bad8
commit 9ee672504f
110 files changed
+2649 -1760

No files matched your search

@@ -1,21 +1,21 @@
---
title: Процесс разработки модуля
title: Разработка модуля
weight: 1
---
**Цель:** Создать новую функцию для бота Quetza путем реализации самодостаточного модуля.
**Цель:** добавить новую возможность в бота Quetza в виде изолированного модуля.
## 1. Фаза концептуализации
## 1. Проектирование модуля
Перед написанием кода определите архитектуру модуля:
Перед написанием кода выберите подходящую структуру модуля:
- **Простая команда:** Требуется только папка `commands/` (например, служебные команды).
- **Реактивная логика:** Нужна папка `events/` для прослушивания жизненного цикла Discord (например, приветственные сообщения).
- **Функция с состоянием:** Требуется **Контроллер** (Controller) для управления состоянием на разных серверах (например, музыкальный плеер).
- **Простая команда:** достаточно каталога `commands/` (например, для служебных команд).
- **Реактивная логика:** нужен каталог `events/` для обработки событий Discord (например, приветственных сообщений).
- **Логика с состоянием:** понадобится контроллер (`Controller`) для управления состоянием между серверами (например, для музыкального плеера).
## 2. Создание структуры
## 2. Структура каталогов
Создайте структуру директорий модуля. Наличие этих файлов запускает автоматическое обнаружение.
Создайте дерево каталогов модуля. Quetza автоматически найдёт и загрузит нужные файлы:
{{< filetree/container >}}
{{< filetree/folder name="src" state="open" >}}
@@ -30,13 +30,13 @@ weight: 1
{{< /filetree/folder >}}
{{< /filetree/container >}}
## 3. Шаги реализации
## 3. Порядок реализации
{{% steps %}}
### Шаг 1: Создание манифеста
### Шаг 1: Манифест модуля
Создайте `module.ts` для объявления модуля.
Создайте `module.ts` с описанием модуля:
```typescript
// src/modules/my-feature/module.ts
@@ -45,9 +45,9 @@ export const description = 'Добавляет крутые возможност
// Опционально: export const controller = new MyFeatureController();
```
### Шаг 2: Реализация команд
### Шаг 2: Команды
Создайте файлы команд в папке `commands/`. Каждый файл экспортирует данные и функцию-исполнитель (executor).
Создайте файлы команд в каталоге `commands/`. Каждый файл экспортирует описание команды и функцию выполнения (`execute`).
```typescript
// src/modules/my-feature/commands/ping.ts
@@ -60,9 +60,9 @@ export async function execute(interaction) {
}
```
### Шаг 3: Реализация событий (Опционально)
### Шаг 3: Обработчики событий (опционально)
Создайте обработчики событий в `events/` для отслеживания состояния Discord.
Создайте обработчики в каталоге `events/`, чтобы реагировать на события Discord:
```typescript
// src/modules/my-feature/events/ready.ts
@@ -76,30 +76,30 @@ export function execute(client) {
}
```
### Шаг 4: Определение контроллера (Опционально)
### Шаг 4: Контроллер (опционально)
Для логики, требующей сохранения состояния, реализуйте контроллер в папке `lib/` и экспортируйте его в `module.ts`.
Если модулю нужно хранить состояние, создайте класс контроллера в каталоге `lib/` и экспортируйте его в `module.ts`.
### Шаг 5: Валидация
### Шаг 5: Проверка
Перезапустите бота.
Перезапустите бота:
1. Проверьте логи на наличие "Loaded module: my-feature".
2. Убедитесь, что команда `/ping` появилась в Discord.
1. Найдите в логах строку «Loaded module: my-feature».
2. Убедитесь, что команда `/ping` появилась и работает в Discord.
{{% /steps %}}
## Шаблоны интеграции
| Паттерн | Сценарий использования | Компоненты |
| Шаблон | Назначение | Состав |
| :--- | :--- | :--- |
| **Простая команда** | Утилиты без состояния (Ping, Бросок кубиков) | Только `commands/` |
| **Сервис с состоянием** | Музыка, RPG, Экономика | `commands/` + `lib/Controller` |
| **Событийно-ориентированный** | Автомодерация, Логирование | Только `events/` |
| **Гибридный** | Сложные функции (ИИ-чат) | Все компоненты |
| **Простая команда** | Утилиты без сохранения состояния (`/ping`, бросок кубика) | Только `commands/` |
| **Сервис с состоянием** | Музыка, ролевые игры, экономика | `commands/` + `lib/Controller` |
| **Событийная логика** | Автомодерация, логирование | Только `events/` |
| **Гибридный модуль** | Сложные сценарии (например, ИИ-чат) | Все компоненты |
---
**См. также:**
- [Руководство Discord.js: Slash-команды](https://discordjs.guide/creating-your-bot/slash-commands.html)
- [Руководство Discord.js: слэш-команды](https://discordjs.guide/creating-your-bot/slash-commands.html)