feat: Telegram QR-Code Invite-Link + WhatsApp Empfang-Fix

Telegram:
- /start <contact_id> Deep-Link Handler: verknüpft Kontakt automatisch mit chat_id
- QR-Code Endpunkt GET /api/v1/contacts/{id}/telegram-qr (PNG)
- TUI: Taste T öffnet QR-Code im Browser (HTML mit eingebettetem PNG)
- config.py + .env.example: TELEGRAM_BOT_USERNAME=mcm_bot
- qrcode[pil] zu requirements.txt hinzugefügt

WhatsApp:
- receiveTimeout 5→3s, HTTP-Timeout 8s → verhindert Polling-Overlap
This commit is contained in:
2026-03-13 14:45:06 +01:00
parent 73619fbc9c
commit 18ad0735ef
9 changed files with 155 additions and 7 deletions

View File

@@ -109,11 +109,29 @@ async def handle_inbound(payload: dict[str, Any]) -> None:
channel = payload["channel"]
if channel == "telegram":
contact = contact_service.get_or_create_by_telegram(
db,
payload["sender_telegram_id"],
name=payload.get("sender_name", "Unknown"),
)
link_contact_id = payload.get("link_contact_id")
if link_contact_id:
# Kontakt aus QR-Code: telegram_id verknüpfen
existing = contact_service.get_by_id(db, link_contact_id)
if existing:
from schemas import ContactUpdate
contact_service.update(
db, existing,
ContactUpdate(telegram_id=payload["sender_telegram_id"])
)
contact = existing
else:
contact = contact_service.get_or_create_by_telegram(
db,
payload["sender_telegram_id"],
name=payload.get("sender_name", "Unknown"),
)
else:
contact = contact_service.get_or_create_by_telegram(
db,
payload["sender_telegram_id"],
name=payload.get("sender_name", "Unknown"),
)
channel_conv_id = payload["chat_id"]
else:
contact = contact_service.get_or_create_by_phone(