The bot service in docker-compose.yml builds from ./bot, but the agent code lived in 'ai procurement/' and ./bot was only a Windows junction on reza.g's machine (and was gitignored) — exactly as the team reported: 'bot/ was never committed — prod-v7's bot is un-buildable from the repo.' - junction removed; 'ai procurement/' renamed to 'bot/' via git mv (all 41 files keep their history as pure renames) - 'bot/' dropped from .gitignore (voice/ stays ignored — runtime voice notes; bot/.env stays ignored by bot/.gitignore) - compose needs no change: context: ./bot and ./bot/app now resolve to committed files - bot/INTEGRATION-REPORT.md added: full story (problem, root cause, git state, security note on the committed BALE_BOT_TOKEN / AI_API_KEY compose defaults, and usage instructions for the team) Verified: 41 renames staged with zero secret/cache files; voice/ and bot/.env still ignored.
47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
"""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))
|