Files
ermnvldmr.com/services/docs/content/ru/quetza/guides/module-development.md
T
deytenit b3638f4d63 fix: cyrillic fonts, dev certs, page head, and ru-text typography (#67)
🤖 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`.
2026-10-25 15:21:09 +03:00

4.4 KiB

title, weight
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 с описанием модуля:

// src/modules/my-feature/module.ts
export const name = 'my-feature';
export const description = 'Добавляет крутые возможности';
// Опционально: export const controller = new MyFeatureController();

Шаг 2: Команды

Создайте файлы команд в каталоге commands/. Каждый файл экспортирует описание команды и функцию выполнения (execute).

// 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:

// 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/
Гибридный модуль Сложные сценарии (например, ИИ-чат) Все компоненты

См. также: