main
py 83 lines 2.55 KB
Raw
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 }