Ночной бот — Telegram bot that announces покур in a chat
  • Python 68.9%
  • JavaScript 12.4%
  • CSS 9.9%
  • HTML 7.7%
  • Dockerfile 1.1%
Find a file
PoweredDeveloper 6b37cf6691
All checks were successful
deploy / deploy (push) Successful in 5m45s
fix(dashboard): reap orphaned chromium helpers with an init process
Headless chromium leaves crashpad/zygote children behind. Python runs as PID 1
in the container and never reaps them, so every stats card leaks a handful of
zombie processes (10 in the first 90 minutes of uptime, thousands over a week).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-28 17:25:17 +03:00
.forgejo/workflows Deploy from host network without Hub IPv6 2026-09-25 12:52:35 +03:00
dashboard Speed up /stats and keep card labels visible 2026-09-25 14:29:38 +03:00
src/nochnoy_bot Keep kisses in groups and finish the countdown 2026-09-25 14:43:53 +03:00
.dockerignore Include README in Docker build context for uv package metadata 2026-09-25 02:48:50 +03:00
.env.example Add favicon, /stats card, and kiss countdown 2026-09-25 13:12:23 +03:00
.gitignore Add React dashboard behind bot.mikyss.ru 2026-09-25 12:21:08 +03:00
docker-compose.yml fix(dashboard): reap orphaned chromium helpers with an init process 2026-09-28 17:25:17 +03:00
Dockerfile Speed up /stats and keep card labels visible 2026-09-25 14:29:38 +03:00
pyproject.toml Add Docker Postgres for pokur stats and RSVP 2026-09-25 10:51:44 +03:00
README.md Add Forgejo Actions deploy on push to main 2026-09-25 12:42:32 +03:00
uv.lock Add Docker Postgres for pokur stats and RSVP 2026-09-25 10:51:44 +03:00

Ночной бот

Telegram-бот Ночной бот. Команда /pokur публикует объявление о покуре в тот чат, где бот добавлен.

Команды

Команда Что делает
/start Приветствие
/help Подсказка
/pokur СЕЙЧАС, у входа в уник
/pokur <время> <локация> Своё время и место
/dota Алерт Dota II
/ya_kuryu В список / из списка на покур
/ya_eblan В список / из списка на доту
/kiss Кого сегодня целует Мадина (один человек на сутки, UTC+03)

Postgres крутится рядом в Docker (db). На алертах покура и доты кнопки ✅ (список + счётчик) и ❌ (только счётчик отказов), внизу подсказка как записаться в список (/ya_kuryu / /ya_eblan). Поцелуи /kiss тоже копятся в БД.

/dota без аргументов — тот же стиль, что покур, но DOTA II ALERT, «играем в доту», кнопки ✅/❌ и внизу /ya_eblan.

/kiss раз в сутки (полночь UTC+03) выбирает человека из тех, кого бот видел в чате. Первый вызов за день — отсчёт 5…4…3…, сообщение с таймером удаляется, затем «мадина сегодня целует @username». Повтор в тот же день только называет, кого уже выбрали. Все поцелуи пишутся в Postgres. Чтобы пул был шире, в BotFather выключи Group Privacy.

Пример:

/pokur 17:30 hall

Сообщение в чате (эмодзи каждый раз случайные из пака):

🚨🚨🚨  ПОКУР ALERT  🚨🚨🚨

(1 random, not siren)  17:30 у входа в уник

от мадины 💋💋

запишись в список: /ya_kuryu

hall / холл всегда подписывается как «у входа в уник». Другая локация пишется как есть.

Эмодзи

По умолчанию стоят обычные эмодзи (🌙 📍 🕐). Можно подставить custom emoji pack Telegram.

  1. Собери custom emoji pack через @Stickers (именно custom emoji, не обычные стикеры).
  2. Скопируй short name пака — из ссылки https://t.me/addemoji/<name> это <name>.
  3. В .env:
CUSTOM_EMOJI_PACK=YourPackByBot

Бот берёт из пака эмодзи, привязанные к 🌙/🚬, 📍 и 🕐. Если таких нет — берёт первые три custom emoji из пака.

Либо укажи id вручную (из пака / Bot API getStickerSet):

CUSTOM_EMOJI_POKUR=5368324170671202286
CUSTOM_EMOJI_LOCATION=...
CUSTOM_EMOJI_TIME=...

Настройка

  1. Создай бота в @BotFather, имя — Ночной бот.
  2. Скопируй .env.example в .env, вставь токен и пароль Postgres:
BOT_TOKEN=123456789:AA...
POSTGRES_PASSWORD=long-random-password
DATABASE_URL=postgresql://nochnoy:long-random-password@db:5432/nochnoy
  1. Добавь бота в нужный чат.

Запуск через uv

uv sync
uv run python -m nochnoy_bot

Docker

Поднимает Postgres (nochnoy-db, том nochnoy-pgdata), бота и дашборд. Порт 5432 наружу не открывается. Дашборд слушает 8091 на сервере, снаружи — https://bot.mikyss.ru (nginx на nova).

В чужих группах бот не отвечает и выходит. Разрешённые чаты — ALLOWED_CHAT_IDS или те, что уже есть в БД.

docker compose up --build -d

Логи: docker compose logs -f

Остановка: docker compose down (данные Postgres остаются в томе, пока не сделать down -v)

CI/CD

Пуш в main на Forgejo сам обновляет стек на этой же машине (Forgejo Actions + runner). Ручной git pull на сервере не нужен.