#!/usr/bin/env python3 """ scripts/generar_codigo.py — Genera códigos de invitación de un solo uso. Cada código solo puede ser usado por una persona para registrarse. Una vez consumido queda marcado en la DB y no se puede reutilizar. Uso: python scripts/generar_codigo.py # genera uno aleatorio python scripts/generar_codigo.py --codigo abc123 # usa el código que vos elegís python scripts/generar_codigo.py --cantidad 5 # genera 5 códigos de una vez """ from __future__ import annotations import argparse import asyncio import secrets import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from config import get_settings from database import crear_invite_code, init_db def _generar() -> str: return secrets.token_urlsafe(6) # 8 chars URL-safe, 48 bits de entropía async def main() -> None: parser = argparse.ArgumentParser(description="Genera códigos de invitación de un solo uso") parser.add_argument("--codigo", help="Código específico a registrar (default: aleatorio)") parser.add_argument("--cantidad", type=int, default=1, help="Cantidad de códigos a generar (default: 1)") args = parser.parse_args() settings = get_settings() await init_db(settings.db_path) codigos: list[str] = [] if args.codigo: codigos = [args.codigo] else: codigos = [_generar() for _ in range(args.cantidad)] for codigo in codigos: await crear_invite_code(codigo) print() if len(codigos) == 1: print(f" Código generado: {codigos[0]}") print() print(" Compartilo con el abogado que necesita registrarse.") print(" Solo puede ser usado una vez.") else: print(f" {len(codigos)} códigos generados (un solo uso cada uno):\n") for c in codigos: print(f" {c}") print() print(" El código del .env (INVITE_CODE) sigue funcionando como acceso ilimitado.") print() if __name__ == "__main__": asyncio.run(main())