79 lines
2.9 KiB
Python
79 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
recept_telegram.py — Telegram přenos pro recept-resolver.
|
|
|
|
Používá USER účet agenta (Claude Buzalka @vlado_claude_agent) přes Telethon
|
|
z Knihovny/telegram_user.py — VLASTNÍ session "recepty" (per-agent autorizace).
|
|
Odpovědi se párují přes Telegram reply (reply_to_msg_id), takže víc agentů na
|
|
témž účtu se nepoplete a každý si hlídá jen své odpovědi.
|
|
|
|
JEDNORÁZOVÝ KROK (dělá uživatel v terminálu — čeká na SMS kód):
|
|
python -m Knihovny.telegram_user login --jako recepty
|
|
|
|
Konfigurace (Medevio/.env): TELEGRAM_API_ID, TELEGRAM_API_HASH, TELEGRAM_PHONE
|
|
(viz Trilium „2026-06-14 Telegram — bot, user účet agenta a MCP server").
|
|
"""
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
from Knihovny.telegram_user import posli_jako_ja, precti_zpravy, _new_client # noqa: E402
|
|
|
|
# Vlastní session recept-agenta (jedno přihlášení: login --jako recepty).
|
|
SESSION = "recepty"
|
|
|
|
# Komu agent píše = Vladův hlavní účet (z Trilium / TELEGRAM_CHAT_ID).
|
|
VLADO_UID = int(os.environ.get("TELEGRAM_CHAT_ID", "6639316354"))
|
|
|
|
|
|
def priprav() -> None:
|
|
"""Načte dialogy → do session cache se uloží entita Vlada. Nová session by ji
|
|
jinak neznala a posílání by spadlo na 'Could not find the input entity'.
|
|
Volá se jednou při startu resolveru (idempotentní, levné)."""
|
|
with _new_client(SESSION) as client:
|
|
if client.is_user_authorized():
|
|
client.get_dialogs(limit=50)
|
|
|
|
|
|
def posli_otazku(text: str) -> int:
|
|
"""Pošle otázku Vladovi z účtu agenta. Vrátí message_id (pro párování reply)."""
|
|
msg = posli_jako_ja(VLADO_UID, text, session=SESSION)
|
|
return msg.id
|
|
|
|
|
|
def posli_zpravu(text: str) -> None:
|
|
"""Pošle prostou zprávu (potvrzení / chybu)."""
|
|
posli_jako_ja(VLADO_UID, text, session=SESSION)
|
|
|
|
|
|
def baseline_since() -> int:
|
|
"""Aktuální nejvyšší message_id v chatu — výchozí bod při prvním startu
|
|
(aby resolver nezpracoval starou historii)."""
|
|
zpravy = precti_zpravy(VLADO_UID, limit=1, session=SESSION)
|
|
return max((z["id"] for z in zpravy), default=0)
|
|
|
|
|
|
def nacti_odpovedi(since_id: int = 0, limit: int = 50):
|
|
"""Vrátí (nove_odpovedi, novy_since_id).
|
|
|
|
Bere jen PŘÍCHOZÍ zprávy (ne naše) s id > since_id. Každá:
|
|
{message_id, text, reply_to_message_id}
|
|
"""
|
|
zpravy = precti_zpravy(VLADO_UID, limit=limit, session=SESSION)
|
|
out = []
|
|
new_since = since_id
|
|
for z in zpravy:
|
|
mid = z["id"]
|
|
if mid > new_since:
|
|
new_since = mid
|
|
if mid > since_id and not z["odeslal_ja"]:
|
|
out.append({
|
|
"message_id": mid,
|
|
"text": z["text"],
|
|
"reply_to_message_id": z["reply_na"],
|
|
})
|
|
out.sort(key=lambda x: x["message_id"]) # od nejstarší
|
|
return out, new_since
|