"""Casdoor linking: chat ↔ ERP user (validated through the real login endpoint).""" import logging from app.api.client import ApiError from app.runtime import ROLE_FA from app.texts import LINK_ASK_PASSWORD, LINK_FAIL, LINK_OK, esc logger = logging.getLogger("bot.links") async def finish_username_step(ctx, chat_id: int, flow, text: str) -> None: username = (text or "").strip() if not username or username.startswith("/"): ctx.pending.pop(chat_id) return flow.kind = "link_password" flow.data["username"] = username await ctx.send(chat_id, LINK_ASK_PASSWORD) async def finish_link(ctx, chat_id: int, flow, text: str | None, password: str) -> None: username = flow.data.get("username") or "" ctx.pending.pop(chat_id) if not password or password.startswith("/"): return try: data = await ctx.api.login(username, password) except ApiError as exc: await ctx.send(chat_id, LINK_FAIL.format(detail=esc(exc.message))) return except Exception as exc: # network etc. logger.exception("login failed") await ctx.send(chat_id, LINK_FAIL.format(detail=esc(str(exc)[:200]))) return user = data.get("user") or {} display = " ".join(x for x in [user.get("first_name"), user.get("last_name")] if x) or username await ctx.links.upsert( chat_id=chat_id, user_id=user.get("id"), username=username, display_name=display, role=user.get("role"), ) role_fa = ROLE_FA.get(user.get("role") or "", user.get("role") or "بدون نقش") await ctx.send(chat_id, LINK_OK.format(name=esc(display), role=role_fa))