Переписанная версия чисто ИИ
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Niken 3d54257dd7 fix: закрытие уязвимостей (security audit)
Critical:
- download_mp3: URL validation (только YouTube), -- separator, max size 50MB
- Ошибки yt-dlp/GPT не уходят пользователю (лог на сервере)
- GPT URL из .env (GPT_API_URL) вместо хардкода IP

Medium:
- weather: sanitize_city — буквы/пробел/дефис, макс 100 символов
- callback group: валидация против VALID_GROUPS
- Mutex poisoning: unwrap_or_else(|e| e.into_inner())
- PDF download: max 50MB лимит, Content-Length проверка

Low:
- .env.example: добавлены ACCESS_TOKEN, DEEPGRAM_API_KEY, GPT_API_URL
- dotenv: только dotenv::dotenv().ok() (без поиска по директориям)
2026-07-27 02:33:20 +03:00
src fix: закрытие уязвимостей (security audit) 2026-07-27 02:33:20 +03:00
.env.example fix: закрытие уязвимостей (security audit) 2026-07-27 02:33:20 +03:00
.gitignore initial commit: порт myfirstprogramm на Rust (teloxide) 2026-07-26 19:09:43 +03:00
AGENTS.md Оптимизация производительности и памяти: 2026-07-27 01:53:11 +03:00
Cargo.lock mimalloc глобальный аллокатор, SQLite WAL, семафор PDF рендера, удалён мёртвый код 2026-07-27 01:56:09 +03:00
Cargo.toml Cargo features для аддонов, cfg-гейты, тесты addon 2026-07-27 02:05:19 +03:00
PLAN.md initial commit: порт myfirstprogramm на Rust (teloxide) 2026-07-26 19:09:43 +03:00
README.md README.md 2026-07-27 02:06:45 +03:00

myfirstprogrammonrust

Telegram-бот для проверки и рассылки расписаний учебных групп. Портирован с Python (aiogram) на Rust (teloxide).

Возможности

  • Расписание — получить расписание на день текстом (/rasp) или картинкой (/prasp)
  • Слежка — автоматическая проверка Google Drive на появление нового расписания (/power on)
  • Аддоны: погода, опросы, GPT-чат, todo-лист, генератор изображений, скачивание MP3 и другие
  • Админка: логи, статус, аналитика, массовая рассылка, удаление сообщений

Быстрый старт

# 1. Скопировать .env
cp .env.example .env
# 2. Заполнить TELEGRAM_BOT_TOKEN и другие переменные
# 3. Запустить
cargo run --release

Переменные окружения

Переменная Описание
TELEGRAM_BOT_TOKEN Токен бота от @BotFather
ACCESS_TOKEN Токен для доступа к API
DEEPGRAM_API_KEY Ключ Deepgram (для голосовых)
DISABLE_PERSISTENCE Отключить логирование и хранение (1)
DISABLE_LOGGING Отключить только логирование
DISABLE_STORAGE Отключить только хранение сообщений
SCHEDULE_DRIVE_FOLDER_ID ID папки Google Drive с расписаниями

Команды

Расписание

  • /rasp <группа> [дни] — расписание текстом (по умолчанию на сегодня)
  • /prasp <группа> [дни] — расписание картинкой
  • /set — выбрать группу (inline-клавиатура)

Аддоны

  • /hello, /bye — приветствие
  • /id — ID пользователя и чата
  • /weather [город] — погода (wttr.in)
  • /gpt <вопрос> — GPT-чат
  • /poll Вопрос | вариант1 | вариант2 — опрос
  • /r34 <тег> — поиск изображений
  • /xdays YYYY-MM-DD — дней до даты
  • /draw [размер] — генератор градиента
  • /todo_add, /todo_list, /todo_del — список задач
  • /mp3 <URL> — скачать аудио с YouTube
  • /apps — мини-приложения
  • /mute [сек] [причина] — замутить пользователя (админ level 0)
  • /send_all <текст> — массовая рассылка (админ level 0)

Администрирование

  • /log — получить лог-файл (level 3)
  • /status — статус бота, CPU, RAM, батарея (level 3)
  • /analytics — аналитика (level 1)
  • /del — удалить все сообщения бота (level 1)
  • /power on [дней] / /power off — управление слежкой (level 2)

Аддоны: отключение

По умолчанию включены все. Чтобы собрать без ненужных:

# Без аддонов вообще
cargo build --release --no-default-features

# Только hello + id
cargo build --release --no-default-features \
  --features "addon-hello,addon-id"

Список features: addon-hello, addon-id, addon-mute, addon-weather, addon-todo, addon-gpt, addon-poll, addon-rule34, addon-xdays, addon-draw, addon-sendmsg, addon-mp3, addon-miniapps.

Сборка

cargo build              # debug
cargo build --release    # release (LTO, stripped)
cargo test               # тесты
cargo clippy             # линтер

Структура проекта

src/
├── main.rs                       # точка входа, регистрация хендлеров
├── config.rs                     # переменные окружения, уровни админов
├── state.rs                      # in-memory состояние бота
├── handlers/
│   ├── admin.rs                  # /log, /status, /power, /del, /analytics
│   └── schedule.rs               # /rasp, /prasp, /set, inline-клавиатура
├── services/
│   ├── drive_schedule_source.rs  # парсинг Google Drive embed-страницы
│   ├── schedule_service.rs       # извлечение текста из PDF, рендер PNG
│   └── watcher_service.rs        # фоновая проверка расписания
├── storage/
│   ├── db.rs                     # SQLite (WAL mode, connection singleton)
│   ├── message_storage.rs        # сохранение message_id для /del
│   └── users_storage.rs          # привязка группы к пользователю
├── utils/
│   ├── antispam.rs               # защита от спама
│   ├── logging_config.rs         # tracing-subscriber
│   └── mac_metrics.rs            # батарея, CPU, RAM (macOS)
└── addons/
    ├── hello.rs, id.rs, mute.rs, weather.rs
    ├── todo.rs, gpt.rs, poll.rs, rule34.rs
    ├── x_days_to.rs, draw.rs
    ├── send_message.rs, download_mp3.rs, miniapps.rs
    └── mod.rs                    # pub mod с #[cfg(feature)]