Телеграм-бот хакерспейса на TypeScript + mtcute. Три подсистемы поверх общего стейта: сборы донатов, присутствие резидентов и статус 3D-принтера.
Бот работает только в чатах из allowlist (ALLOWED_CHATS); в остальных молча игнорирует всё.
Один сбор на календарный период (по умолчанию — месяц UTC).
/goals— показать текущий сбор. К сообщению цепляется кнопка «Обновить», а при нескольких страницах — стрелки◀️ ▶️./donate <сумма> <ник>— добавить донат; без ника — анонимный (в списке «Анонимно»)./remove <номер>— удалить все донаты участника с этого места в лидерборде./remove <ник> [сумма]— удалить один донат по нику (и опционально сумме)./setgoal <сумма>— задать цель (0 — снять)./settitle <тема>— изменить тему сбора (по умолчанию «аренду»)./setdesc <текст>— описание под сбором (реквизиты/ссылки, многострочное; без текста — убрать)./setresetday <1–29>— день месяца, в который сбор сбрасывается (по умолчанию 1).
Лидерборд группируется по нику и сортируется по сумме, топ-3 — 🥇🥈🥉. При достижении цели появляется пометка «✅ Сбор закрыт». Сообщение перерисовывается на месте при правках; при смене периода переключается на новый сбор автоматически. Каждый день в 00:00 и 12:00 по МСК бот постит свежее сообщение со сбором. Команды сборов — только для админов группы.
Резиденты — админы подключённых чатов.
/startв личке — меню «Отметиться с ником / без ника»./inside— показать (или обновить) список тех, кто сейчас в спейсе; доступна любому участнику allowlist-чата.- При отметке список присутствующих постится во все чаты, где резидент — админ.
- Каждые 3 часа бот пингует в личку; кнопка «Я внутри» продлевает отметку, через 15 минут без ответа отметка снимается.
- Если в чате тишина ≥ 5 часов и есть отмеченные — бот сам пушит актуальный список.
- Авто-отметки по MAC:
/bindmac <MAC>в личке привязывает устройство; бот опрашивает роутер Keenetic и сам отмечает резидента, пока устройство в сети (снимает через 10 минут отсутствия). Управление:/maclist,/unbindmac,/settings.
/printer— статус из Moonraker (Klipper). Доступна в личке всем и в allowlist-чатах.- При активной печати показывает прогресс, превью (миниатюра gcode / снимок вебки, переключаются кнопками) и кнопку «Уведомить по окончании» — подписчик получит сообщение в личку, когда печать завершится.
cp .env.example .env # заполнить API_ID/API_HASH/BOT_TOKEN/ALLOWED_CHATS
npm install
npm start # tsx src/index.ts; npm run dev — watch-режимПеременные окружения — в .env.example. Обязательны API_ID, API_HASH, BOT_TOKEN, ALLOWED_CHATS. Опционально: PRINTER_URL/PRINTER_AUTH (иначе /printer выключен), KEENETIC_URL/KEENETIC_LOGIN/KEENETIC_PASSWORD (иначе авто-отметки по MAC выключены), DATA_FILE, форвардинг и live-чат.
Стейт — в файле DATA_FILE (по умолчанию ./data.json), сессия mtcute — в bot.session. Тестов и линтера нет; проверка — npm run typecheck.
src/index.ts— точка входа: env, клиент, диспетчер, регистрация хендлеров, шедулеры.src/handlers.ts— команды сборов, callback пагинации/обновления, проверки allowlist/админа.src/fundraiser.ts— модель сбора: лидерборд, прогресс-бар, периоды, парсинг команд.src/presence.ts— присутствие: меню, пинги, тишина в чатах, watcher удалений.src/keenetic.ts— клиент RCI-API Keenetic для авто-отметок по MAC.src/printer.ts—/printer, запросы к Moonraker, поллер окончания печати.src/scheduler.ts— перерисовка сообщения при смене периода + ежедневный постинг.src/storage.ts— JSON-хранилище с атомарной записью.src/types.ts— типы стейта.