Spaces:
Running
Running
feat: add cooldown period to WhatsApp status checks to prevent redundant pairing requests
Browse files- wa-guardian.js +20 -0
wa-guardian.js
CHANGED
|
@@ -17,6 +17,7 @@ const GATEWAY_TOKEN = process.env.GATEWAY_TOKEN || "huggingclaw";
|
|
| 17 |
const CHECK_INTERVAL = 5000;
|
| 18 |
const WAIT_TIMEOUT = 120000;
|
| 19 |
const POST_515_NO_LOGOUT_MS = 90 * 1000;
|
|
|
|
| 20 |
const RESET_MARKER_PATH = path.join(
|
| 21 |
process.env.HOME || "/home/node",
|
| 22 |
".openclaw",
|
|
@@ -27,6 +28,7 @@ const RESET_MARKER_PATH = path.join(
|
|
| 27 |
let isWaiting = false;
|
| 28 |
let hasShownWaitMessage = false;
|
| 29 |
let last515At = 0;
|
|
|
|
| 30 |
|
| 31 |
function extractErrorMessage(msg) {
|
| 32 |
if (!msg || typeof msg !== "object") return "Unknown error";
|
|
@@ -117,10 +119,27 @@ async function callRpc(ws, method, params) {
|
|
| 117 |
|
| 118 |
async function checkStatus() {
|
| 119 |
if (isWaiting) return;
|
|
|
|
| 120 |
|
| 121 |
let ws;
|
| 122 |
try {
|
| 123 |
ws = await createConnection();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
isWaiting = true;
|
| 125 |
if (!hasShownWaitMessage) {
|
| 126 |
console.log("\n[guardian] 📱 WhatsApp pairing in progress. Please scan the QR code in the Control UI.");
|
|
@@ -139,6 +158,7 @@ async function checkStatus() {
|
|
| 139 |
|
| 140 |
if (result && (result.connected || linkedAfter515)) {
|
| 141 |
hasShownWaitMessage = false;
|
|
|
|
| 142 |
|
| 143 |
if (linkedAfter515) {
|
| 144 |
console.log("[guardian] 515 after scan: credentials saved, reloading config to start WhatsApp...");
|
|
|
|
| 17 |
const CHECK_INTERVAL = 5000;
|
| 18 |
const WAIT_TIMEOUT = 120000;
|
| 19 |
const POST_515_NO_LOGOUT_MS = 90 * 1000;
|
| 20 |
+
const SUCCESS_COOLDOWN_MS = 60 * 1000;
|
| 21 |
const RESET_MARKER_PATH = path.join(
|
| 22 |
process.env.HOME || "/home/node",
|
| 23 |
".openclaw",
|
|
|
|
| 28 |
let isWaiting = false;
|
| 29 |
let hasShownWaitMessage = false;
|
| 30 |
let last515At = 0;
|
| 31 |
+
let lastConnectedAt = 0;
|
| 32 |
|
| 33 |
function extractErrorMessage(msg) {
|
| 34 |
if (!msg || typeof msg !== "object") return "Unknown error";
|
|
|
|
| 119 |
|
| 120 |
async function checkStatus() {
|
| 121 |
if (isWaiting) return;
|
| 122 |
+
if (lastConnectedAt && Date.now() - lastConnectedAt < SUCCESS_COOLDOWN_MS) return;
|
| 123 |
|
| 124 |
let ws;
|
| 125 |
try {
|
| 126 |
ws = await createConnection();
|
| 127 |
+
|
| 128 |
+
const statusRes = await callRpc(ws, "channels.status", {});
|
| 129 |
+
const channels = (statusRes.payload || statusRes.result)?.channels || {};
|
| 130 |
+
const wa = channels.whatsapp;
|
| 131 |
+
|
| 132 |
+
if (!wa) {
|
| 133 |
+
hasShownWaitMessage = false;
|
| 134 |
+
return;
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
if (wa.connected) {
|
| 138 |
+
hasShownWaitMessage = false;
|
| 139 |
+
lastConnectedAt = Date.now();
|
| 140 |
+
return;
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
isWaiting = true;
|
| 144 |
if (!hasShownWaitMessage) {
|
| 145 |
console.log("\n[guardian] 📱 WhatsApp pairing in progress. Please scan the QR code in the Control UI.");
|
|
|
|
| 158 |
|
| 159 |
if (result && (result.connected || linkedAfter515)) {
|
| 160 |
hasShownWaitMessage = false;
|
| 161 |
+
lastConnectedAt = Date.now();
|
| 162 |
|
| 163 |
if (linkedAfter515) {
|
| 164 |
console.log("[guardian] 515 after scan: credentials saved, reloading config to start WhatsApp...");
|