🤖 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`.
4.2 KiB
title, weight
| title | weight |
|---|---|
| Диагностика | 1 |
Цель: выявить и устранить частые ошибки при разработке под Quetza.
1. Сбои при обнаружении модулей
Симптом: бот запускается, но модуль не подхватывается. Причина: нарушена структура файлов или соглашения об именах.
{{% details title="Чек-лист: Структура директорий" closed="false" %}}
- Каталог модуля существует:
src/modules/<name>/. - Файл
module.tsэкспортирует переменнуюname. - Каталог команд называется именно
commands/(а неcmds/). - Выполнена сборка
pnpm build(Quetza работает изdist/). {{% /details %}}
2. Проблемы с регистрацией команд
Симптом: команда /command не появляется в Discord.
Глобальная регистрация и регистрация на тестовом сервере
- Глобальная регистрация: команды, зарегистрированные глобально, могут обновляться до 1 часа и подпадают под жёсткие лимиты Discord по частоте запросов (rate limits).
- Тестовый сервер (guild): в режиме разработки Quetza публикует команды на указанном сервере мгновенно.
- Настройка: проверьте, что в
.envустановлены переменныеNODE_ENV=developmentиDEV_GUILD_ID.
- Настройка: проверьте, что в
Лимиты частоты запросов (Rate Limits)
Частая повторная публикация глобальных команд приводит к превышению лимитов Discord. Для итеративной разработки всегда используйте тестовый сервер.
3. Ошибки взаимодействия (Interaction Failures)
Симптом: сообщение «Приложение не отвечает». Причина: обработка команды длилась дольше 3 секунд без отложенного ответа (deferReply).
Решение:
// ПЛОХО
await longRunningTask();
await interaction.reply('Готово'); // Слишком поздно!
// ХОРОШО
await interaction.deferReply();
await longRunningTask();
await interaction.editReply('Готово');
4. Утечки состояния
Симптом: потребление памяти растёт, данные перемешиваются между разными серверами. Причина: состояние хранится глобально, а не изолированно для каждого сервера.
Диагностика: Проверьте код контроллера:
- ❌
private player: AudioPlayer;(состояние общее для всех серверов) - ✅
private players = new Map<string, AudioPlayer>();(состояние изолировано по ID сервера)
5. Обработка событий
Симптом: обработчик срабатывает несколько раз или не вызывается вовсе.
- Срабатывает несколько раз: слушатели событий суммируются. Проверьте, не зарегистрирован ли один и тот же обработчик в двух разных модулях.
- Не срабатывает: убедитесь, что обработчик корректно экспортирует
nameиexecute.
Tip
Режим отладки (Debug Mode): включите подробное логирование, чтобы видеть список всех модулей и команд, загружаемых на этапе старта бота.