"""Local dev CLI for the CM bot. Mirrors Telegram /1, /2, /3 plus operational commands. No-arg invocation drops into a stdlib TUI menu. """ import argparse import sys from .cm_bot_hal import CM_BOT_HAL def cmd_interactive(_args): raise NotImplementedError("cmd_interactive is implemented in a later task") def _print_user(user: dict) -> None: print(f"Username: {user['username']}") print(f"Password: {user['password']}") print(f"Link: {user['link']}") def cmd_register(_args): bot = CM_BOT_HAL() _print_user(bot.get_user_api()) def cmd_set_pin(args): bot = CM_BOT_HAL() if not bot.is_whatsapp_url(args.link): print(f"ERROR: not a WhatsApp URL: {args.link}", file=sys.stderr) sys.exit(2) t_username, f_username = bot.get_whatsapp_link_username(args.link) success = bot.set_security_pin_api(args.link) if not success: print("ERROR: set_security_pin_api returned a falsy result", file=sys.stderr) sys.exit(1) print(f"OK: f_username={f_username} t_username={t_username}") def build_parser() -> argparse.ArgumentParser: p = argparse.ArgumentParser( prog="bot_cli", description="CM Bot dev CLI (mirrors Telegram triggers).", ) sub = p.add_subparsers(dest="command") sp = sub.add_parser("register", aliases=["get-acc"], help="Get next available account (Telegram /1).") sp.set_defaults(func=cmd_register) sp = sub.add_parser("set-pin", help="Set security PIN from a WhatsApp link (Telegram /2).") sp.add_argument("link") sp.set_defaults(func=cmd_set_pin) return p def main(argv=None) -> int: parser = build_parser() args = parser.parse_args(argv) if args.command is None: return cmd_interactive(args) or 0 return args.func(args) or 0 if __name__ == "__main__": sys.exit(main())