Artem Tsyrulnikov 2ffd31885e fix: ensure poll unpins reliably and remove duplicate quiz
- Remove the extra Wednesday 16:19 send_quiz job; only the Friday 17:00
  quiz remains, matching the /start description. The duplicate send
  overwrote the poll mapping, orphaning the earlier pinned poll so it
  was never unpinned.
- Extract unpinPoll() and call it at the start of CreatePairs so the
  poll is always unpinned, even when no pairs can be formed (previously
  early returns skipped the unpin block entirely).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 22:02:55 +03:00
2026-02-08 20:22:47 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00
2026-02-05 15:41:56 +03:00

Random Coffee Bot

Telegram бот для организации случайных встреч (Random Coffee) между участниками групп.

Описание

Бот автоматически создает уникальные пары участников для неформальных встреч:

  • 📊 Отправляет опросы участникам каждую пятницу
  • 👥 Формирует пары каждое воскресенье
  • 🔄 Отслеживает историю встреч (пары не повторяются)
  • 🌐 Поддержка нескольких групп одновременно
  • 🗄️ Миграции базы данных через Alembic

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

1. Клонирование репозитория

git clone https://github.com/yourusername/random_coffee_bot.git
cd random_coffee_bot

2. Настройка окружения

Создайте файл .env на основе .env.example:

cp .env.example .env

Заполните .env:

bot__token=YOUR_BOT_TOKEN                    # Токен от @BotFather
bot__group_chat_ids='[]'                     # Оставьте пустым, группы добавятся через команды
bot__admin_chat_ids='[YOUR_TELEGRAM_ID]'     # Ваш Telegram ID
db__url='sqlite+aiosqlite:///random_coffee.db'

Как получить Telegram ID:

3. Запуск

Docker (рекомендуется)

# Собрать и запустить
docker-compose up -d --build

# Просмотр логов
docker-compose logs -f

# Остановка
docker-compose down

Локально

# Установка зависимостей
uv sync

# Применить миграции
alembic upgrade head

# Запуск
python -m src.main

Использование

Команды для админов

В личных сообщениях с ботом:

  • /groups - Список подключенных групп

В группах (только админы):

  • /add_group - Добавить текущую группу
  • /remove_group - Удалить текущую группу
  • /send_quiz - Отправить опрос вручную
  • /create_pairs - Создать пары вручную

Автоматическое расписание

Бот работает по расписанию (московское время):

  • Пятница 17:00 - Отправка опроса участникам
  • Воскресенье 19:00 - Формирование и публикация пар

Первая настройка

  1. Запустите бота
  2. Добавьте бота в нужные группы
  3. Выдайте боту права администратора (для чтения сообщений)
  4. Напишите боту в личку /start
  5. В каждой группе напишите /add_group

Архитектура

Проект следует принципам Clean Architecture:

src/
├── adapter/          # Внешние интерфейсы
│   ├── database/    # SQLAlchemy + async
│   └── telegram/    # Aiogram 3.x
├── controller/       # Обработчики и планировщик
├── usecase/          # Бизнес-логика
├── model/            # Модели данных
└── config.py         # Конфигурация (Pydantic)

Технологии

  • Python 3.13
  • aiogram 3.x - Telegram Bot API
  • SQLAlchemy 2.0 - ORM с async support
  • Alembic - Миграции БД
  • APScheduler - Планировщик задач
  • Pydantic - Валидация конфигурации
  • uv - Управление зависимостями

Разработка

Работа с базой данных

# Создать новую миграцию
alembic revision --autogenerate -m "описание"

# Применить миграции
alembic upgrade head

# Откатить миграцию
alembic downgrade -1

# Текущая версия
alembic current

Структура базы данных

  • participants - Участники опроса (очищается после создания пар)
  • pairs - История всех пар (для предотвращения повторов)
  • poll_mappings - Связь poll_id → group_id

Docker команды

# Пересборка
docker-compose up -d --build

# Логи
docker-compose logs -f randomcoffee_bot

# Перезапуск
docker-compose restart

# Очистка
docker-compose down --rmi all --volumes

Логирование

Логи сохраняются в shared/logs/bot.log и дублируются в консоль. При критических ошибках отправляется уведомление всем админам.

Мультигрупповая поддержка

  • Каждая группа имеет независимый пул участников
  • История пар общая для всех групп - если два человека встретились в группе A, они не встретятся в группе B
  • Планировщик обрабатывает все группы одновременно

Troubleshooting

Бот не видит команды в группе:

  • Проверьте права администратора
  • Отключите Privacy Mode у @BotFather: /setprivacy → Disable

База данных заблокирована:

# Остановите все процессы и пересоздайте базу
rm random_coffee.db
alembic upgrade head

Изменение часового пояса: Измените Europe/Moscow в src/controller/scheduler.py

License

MIT

Description
No description provided
Readme 70 KiB
Languages
Go 98.2%
Dockerfile 1.8%