refactor: rename allowed_users to allowed_numbers across plugin

This commit is contained in:
linuztx 2026-03-28 10:51:47 +08:00
parent e4991b6e6e
commit 39bed4f538
8 changed files with 61 additions and 24 deletions

View file

@ -36,7 +36,7 @@ The WhatsApp session persists across restarts in `usr/whatsapp/sessions/`. No re
| `allow_group` | Respond in group chats when mentioned or replied to | `false` |
| `bridge_port` | Local HTTP port for bridge | `3100` |
| `poll_interval_seconds` | Poll frequency (min 2) | `3` |
| `allowed_users` | Phone numbers without + prefix | `[]` (all) |
| `allowed_numbers` | Phone numbers without + prefix | `[]` (all) |
| `project` | Activate project for WA chats | `""` |
| `agent_instructions` | Extra agent instructions | `""` |

View file

@ -15,7 +15,7 @@ class QrCode(ApiHandler):
port = int(config.get("bridge_port", 3100))
session_dir = files.get_abs_path("usr/whatsapp/sessions")
cache_dir = files.get_abs_path("usr/whatsapp/media")
allowed_users = config.get("allowed_users") or []
allowed_numbers = config.get("allowed_numbers") or []
mode = config.get("mode", "dedicated")
from plugins._whatsapp_integration.helpers.bridge_manager import (
@ -31,7 +31,7 @@ class QrCode(ApiHandler):
if not is_process_alive():
try:
ok = await ensure_bridge_http_up(
port, session_dir, cache_dir, allowed_users, mode=mode,
port, session_dir, cache_dir, allowed_numbers, mode=mode,
)
if not ok:
return {

View file

@ -0,0 +1,37 @@
"""Start WhatsApp bridge immediately."""
from helpers.api import ApiHandler, Request
from helpers.errors import format_error
from helpers import files, plugins
PLUGIN_NAME = "_whatsapp_integration"
class Start(ApiHandler):
async def process(self, input: dict, request: Request) -> dict:
config = plugins.get_plugin_config(PLUGIN_NAME) or {}
port = int(config.get("bridge_port", 3100))
session_dir = files.get_abs_path("usr/whatsapp/sessions")
cache_dir = files.get_abs_path("usr/whatsapp/media")
allowed_numbers = config.get("allowed_numbers") or []
mode = config.get("mode", "dedicated")
from plugins._whatsapp_integration.helpers.bridge_manager import (
ensure_bridge_http_up,
is_process_alive,
)
if is_process_alive():
return {"success": True, "message": "Bridge already running"}
try:
ok = await ensure_bridge_http_up(
port, session_dir, cache_dir, allowed_numbers, mode=mode,
)
if ok:
return {"success": True, "message": "Bridge started"}
return {"success": False, "message": "Failed to start bridge"}
except Exception as e:
return {"success": False, "message": format_error(e)}

View file

@ -6,7 +6,7 @@ bridge_port: 3100
poll_interval_seconds: 3
allow_group: false
# allow_group: respond in group chats when mentioned or replied to
allowed_users: []
allowed_numbers: []
# Example: ["34652029134", "1234567890"]
project: ""
agent_instructions: ""

View file

@ -57,11 +57,11 @@ async def _poll_loop() -> None:
port = int(config.get("bridge_port", 3100))
session_dir = files.get_abs_path("usr/whatsapp/sessions")
cache_dir = files.get_abs_path("usr/whatsapp/media")
allowed_users = config.get("allowed_users") or []
allowed_numbers = config.get("allowed_numbers") or []
mode = config.get("mode", "dedicated")
# Detect config changes that require bridge restart
desired = {"port": port, "mode": mode, "allowed_users": sorted(allowed_users)}
desired = {"port": port, "mode": mode, "allowed_numbers": sorted(allowed_numbers)}
running = bridge_manager.get_running_config()
if bridge_started and bridge_manager.is_process_alive() and running and running != desired:
PrintStyle.info(f"WhatsApp: config changed, restarting bridge")
@ -72,7 +72,7 @@ async def _poll_loop() -> None:
if not bridge_started or not bridge_manager.is_process_alive():
try:
bridge_started = await bridge_manager.start_bridge(
port, session_dir, cache_dir, allowed_users, mode=mode,
port, session_dir, cache_dir, allowed_numbers, mode=mode,
)
except Exception as e:
PrintStyle.error(f"WhatsApp bridge start error: {format_error(e)}")

View file

@ -73,7 +73,7 @@ async def start_bridge(
port: int,
session_dir: str,
cache_dir: str,
allowed_users: list[str] | None = None,
allowed_numbers: list[str] | None = None,
mode: str = "dedicated",
) -> bool:
global _bridge_process
@ -91,8 +91,8 @@ async def start_bridge(
"--cache-dir", cache_dir,
"--mode", mode,
]
if allowed_users:
cmd += ["--allowed-users", ",".join(allowed_users)]
if allowed_numbers:
cmd += ["--allowed-numbers", ",".join(allowed_numbers)]
_kill_port_process(port)
PrintStyle.info("WhatsApp: starting bridge")
@ -104,7 +104,7 @@ async def start_bridge(
), port)
_start_log_reader(_bridge_process)
_bridge_config.clear()
_bridge_config.update({"port": port, "mode": mode, "allowed_users": sorted(allowed_users or [])})
_bridge_config.update({"port": port, "mode": mode, "allowed_numbers": sorted(allowed_numbers or [])})
# Wait for bridge to become healthy
for _ in range(20):
@ -151,7 +151,7 @@ async def ensure_bridge_http_up(
port: int,
session_dir: str,
cache_dir: str,
allowed_users: list[str] | None = None,
allowed_numbers: list[str] | None = None,
mode: str = "dedicated",
) -> bool:
"""Start bridge if needed and wait for HTTP server only (not WA connection)."""
@ -170,8 +170,8 @@ async def ensure_bridge_http_up(
"--cache-dir", cache_dir,
"--mode", mode,
]
if allowed_users:
cmd += ["--allowed-users", ",".join(allowed_users)]
if allowed_numbers:
cmd += ["--allowed-numbers", ",".join(allowed_numbers)]
_kill_port_process(port)
PrintStyle.info("WhatsApp: starting bridge for pairing")

View file

@ -26,10 +26,10 @@
} catch (e) { this.projects = []; }
},
allowed_text() {
return (config?.allowed_users || []).join(', ');
return (config?.allowed_numbers || []).join(', ');
},
set_allowed(val) {
config.allowed_users = val.split(',')
config.allowed_numbers = val.split(',')
.map(s => s.trim().replace(/^\+/, '').replace(/^0+/, ''))
.filter(s => s);
},
@ -239,7 +239,7 @@
<div class="field">
<div class="field-label">
<div class="field-title">Allowed Users</div>
<div class="field-title">Allowed Numbers</div>
<div class="field-description">Use international format without + or leading 0<br>e.g. +1 (415) 555-1234 → 14155551234. Empty = allow all</div>
</div>
<div class="field-control">

View file

@ -46,7 +46,7 @@ const SESSION_DIR = getArg('session', path.join(process.env.HOME || '~', '.agent
const CACHE_DIR = getArg('cache-dir', path.join(process.env.HOME || '~', '.agent-zero', 'whatsapp', 'media'));
const PAIR_ONLY = args.includes('--pair-only');
const MODE = getArg('mode', 'dedicated'); // "dedicated" or "self-chat"
const ALLOWED_USERS = (getArg('allowed-users', '') || '').split(',').map(s => s.trim()).filter(Boolean);
const ALLOWED_NUMBERS = (getArg('allowed-numbers', '') || '').split(',').map(s => s.trim()).filter(Boolean);
mkdirSync(SESSION_DIR, { recursive: true });
mkdirSync(CACHE_DIR, { recursive: true });
@ -198,10 +198,10 @@ async function startSocket() {
if (chatId === 'status@broadcast') continue;
// Check allowlist (resolve LID -> phone if needed)
if (!msg.key.fromMe && ALLOWED_USERS.length > 0) {
if (!msg.key.fromMe && ALLOWED_NUMBERS.length > 0) {
const resolvedNumber = lidToPhone[senderNumber] || senderNumber;
if (!ALLOWED_USERS.includes(resolvedNumber)) {
console.log(`[bridge] Ignored message from ${resolvedNumber} (not in allowed users)`);
if (!ALLOWED_NUMBERS.includes(resolvedNumber)) {
console.log(`[bridge] Ignored message from ${resolvedNumber} (not in allowed numbers)`);
continue;
}
}
@ -616,10 +616,10 @@ if (PAIR_ONLY) {
app.listen(PORT, '127.0.0.1', () => {
console.log(`[bridge] WhatsApp bridge listening on port ${PORT} (mode: ${MODE})`);
console.log(`[bridge] Session: ${SESSION_DIR}`);
if (ALLOWED_USERS.length > 0) {
console.log(`[bridge] Allowed users: ${ALLOWED_USERS.join(', ')}`);
if (ALLOWED_NUMBERS.length > 0) {
console.log(`[bridge] Allowed numbers: ${ALLOWED_NUMBERS.join(', ')}`);
} else {
console.log('[bridge] No allowed users set — all messages will be processed');
console.log('[bridge] No allowed numbers set — all messages will be processed');
}
console.log();
startSocket();