| 1 | """WhatsApp QR code pairing endpoint.""" |
| 2 | |
| 3 | from helpers.api import ApiHandler, Request |
| 4 | from helpers.errors import format_error |
| 5 | from helpers import plugins |
| 6 | |
| 7 | |
| 8 | PLUGIN_NAME = "_whatsapp_integration" |
| 9 | |
| 10 | |
| 11 | class QrCode(ApiHandler): |
| 12 | |
| 13 | async def process(self, input: dict, request: Request) -> dict: |
| 14 | config = plugins.get_plugin_config(PLUGIN_NAME) or {} |
| 15 | port = int(config.get("bridge_port", 3100)) |
| 16 | mode = config.get("mode", "self-chat") |
| 17 | |
| 18 | from plugins._whatsapp_integration.helpers.bridge_manager import ( |
| 19 | ensure_bridge_http_up, |
| 20 | get_bridge_url, |
| 21 | is_process_alive, |
| 22 | ) |
| 23 | from plugins._whatsapp_integration.helpers.storage_paths import ( |
| 24 | get_bridge_media_dir, |
| 25 | get_bridge_session_dir, |
| 26 | ) |
| 27 | from plugins._whatsapp_integration.helpers.wa_client import get_qr |
| 28 | |
| 29 | session_dir = get_bridge_session_dir() |
| 30 | cache_dir = get_bridge_media_dir() |
| 31 | base_url = get_bridge_url(port) |
| 32 | |
| 33 | # Start bridge if not running |
| 34 | if not is_process_alive(): |
| 35 | try: |
| 36 | ok = await ensure_bridge_http_up( |
| 37 | port, session_dir, cache_dir, mode=mode, |
| 38 | ) |
| 39 | if not ok: |
| 40 | return { |
| 41 | "status": "error", |
| 42 | "message": "Failed to start bridge", |
| 43 | "qr": None, |
| 44 | } |
| 45 | except Exception as e: |
| 46 | return { |
| 47 | "status": "error", |
| 48 | "message": format_error(e), |
| 49 | "qr": None, |
| 50 | } |
| 51 | |
| 52 | # Fetch QR status from bridge |
| 53 | try: |
| 54 | data = await get_qr(base_url) |
| 55 | status = data.get("status", "error") |
| 56 | qr = data.get("qr") |
| 57 | |
| 58 | if status == "connected": |
| 59 | return { |
| 60 | "status": "connected", |
| 61 | "message": "WhatsApp is already connected", |
| 62 | "qr": None, |
| 63 | } |
| 64 | |
| 65 | if status == "waiting_scan" and qr: |
| 66 | return { |
| 67 | "status": "waiting_scan", |
| 68 | "message": "Scan the QR code with WhatsApp", |
| 69 | "qr": qr, |
| 70 | } |
| 71 | |
| 72 | return { |
| 73 | "status": "waiting_qr", |
| 74 | "message": "Generating QR code...", |
| 75 | "qr": None, |
| 76 | } |
| 77 | |
| 78 | except Exception as e: |
| 79 | return { |
| 80 | "status": "error", |
| 81 | "message": f"Bridge not reachable: {format_error(e)}", |
| 82 | "qr": None, |
| 83 | } |