ci / build-test (push) Canceled after 0s
SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/ Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue, контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер), Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог). Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0, тесты 1340/130/52/38/9 зелёные.
2.0 KiB
2.0 KiB
Task 4: Telegram-действия поиска (методы TelegramManager)
Files:
- Modify:
backend/app/services/telegram.py(классTelegramManager)
Interfaces:
-
Consumes:
self.client,ban_guard. -
Produces (async-методы):
async def discovery_search(q: str, limit: int = 30) -> list[dict]—client(functions.contacts.SearchRequest(q=q, limit=limit)); вернуть[{id(str), name, username, kind, hue}](kind через_kind_of, hue черезdialog_hue); между вызовами —await asyncio.sleep(ban_guard.search_pause()).async def discovery_info(dialog_id: str) -> dict—{id, name, username, kind, hue, participants: int | None, is_forum: bool}(participants изfull_chatгде возможно; иначе None).async def discovery_read(dialog_id: str, limit: int) -> dict— последние сообщения:{"ok": bool, "error": str | None, "messages": [{"id", "text", "date_ms", "topic_id"}]};topic_id—getattr(getattr(m,'reply_to',None),'reply_to_top_id',None). История недоступна →{"ok": False, "error": "no_history", "messages": []}.async def discovery_join(username: str) -> None—client(functions.channels.JoinChannelRequest(...)); ПЕРЕД вызовомawait ban_guard.wait_join_delay();FloodWaitError→ban_guard.note_flood()и проброс.async def discovery_leave(dialog_id: str) -> None—channels.LeaveChannelRequest.def add_dialog_monitored(dialog_id, name, username, kind, hue) -> None— INSERT/UPDATEdialogsсmonitor=TRUE, backfilled=FALSE(как вset_monitor, но без авто-join-логики).
-
Step 1: Реализовать методы (импорт
telethon.tl.functions,telethon.errors.rpcerrorlist.FloodWaitError). -
Step 2: Проверить компиляцию
py_compile. Полная проверка — после Task 6/7 на живом аккаунте (ручные шаги в Task 10).