Skip to content

endpoint-msk/robot

Repository files navigation

endpoint-robot

Телеграм-бот хакерспейса на 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.

3D-принтер

  • /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 — типы стейта.

About

Endpoint robot source code

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors