82e400ddcd
Chat language: - Added language_code field to TelegramChat model + migration - Saved from message.from.language_code on webhook/polling - Displayed as badge on bot chat cards and target receiver items - Resolved from DB in target API response (works for existing receivers) - Shown in chat picker dropdown (desc includes language) EntitySelect improvements: - Tracker-target link selector shows all targets, already-linked ones appear disabled with "Already linked" hint - Receiver chat picker shows already-added chats as disabled Dev scripts: - scripts/restart-backend.sh and restart-frontend.sh - Updated .claude/docs/dev-servers.md to reference scripts
48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
"""Telegram service utilities — chat persistence helpers."""
|
|
|
|
from sqlmodel import select
|
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
|
|
|
from ..database.models import TelegramChat
|
|
|
|
|
|
async def save_chat_from_webhook(
|
|
session: AsyncSession, bot_id: int, chat_data: dict,
|
|
language_code: str = "",
|
|
) -> None:
|
|
"""Save or update a chat entry from an incoming webhook message.
|
|
|
|
Called by the webhook handler to auto-persist chats.
|
|
"""
|
|
chat_id = str(chat_data.get("id", ""))
|
|
if not chat_id:
|
|
return
|
|
|
|
result = await session.exec(
|
|
select(TelegramChat).where(
|
|
TelegramChat.bot_id == bot_id,
|
|
TelegramChat.chat_id == chat_id,
|
|
)
|
|
)
|
|
existing = result.first()
|
|
|
|
title = chat_data.get("title") or (
|
|
chat_data.get("first_name", "") + (" " + chat_data.get("last_name", "")).strip()
|
|
)
|
|
|
|
if existing:
|
|
existing.title = title
|
|
existing.username = chat_data.get("username", existing.username)
|
|
if language_code:
|
|
existing.language_code = language_code
|
|
session.add(existing)
|
|
else:
|
|
session.add(TelegramChat(
|
|
bot_id=bot_id,
|
|
chat_id=chat_id,
|
|
title=title,
|
|
chat_type=chat_data.get("type", "private"),
|
|
username=chat_data.get("username", ""),
|
|
language_code=language_code,
|
|
))
|