feat(maria): ALLOW_SELF_CHAT — Maria raspunde doar in grupul de test, nu si in self-chat

`TEST_MODE_SELF_CHAT_ONLY` insemna „self-chat SI grupurile permise"; nu exista
niciun fel de a spune „doar grupurile". `ALLOW_SELF_CHAT=false` (nou, implicit
`true`) scoate chatul cu sine insusi din filtrul puntii.

De ce: `SUPPORT_JID` e tot numarul propriu, deci escaladarile, reamintirile si
raspunsurile suportului cadeau in acelasi chat cu intrebarile — Maria isi citea
propriul canal de suport ca pe o discutie cu un client.

Pus pe `false` in `~/.maria-bridge/env`, puntea repornita: raspunde acum doar in
`120363409761730101@g.us` („Maria Test"). Se vede in `/status` (`allowSelfChat`)
si in linia de conectare din log.

Trimiterea catre suport nu e afectata — filtrul e doar pe mesajele primite.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
Claude Agent
2026-09-01 21:12:16 +00:00
parent dee3d1d2f5
commit f46410eb58
3 changed files with 37 additions and 1 deletions

View File

@@ -512,6 +512,28 @@ comenzile explicite: „Maria, stop" / „preiau eu" si „Maria, continua".
`TEST_MODE_SELF_CHAT_ONLY=true`. Filtrul e si in punte, si in consumer. Azi:
`120363409761730101@g.us` — grupul „Maria Test".
`ALLOW_SELF_CHAT=false` scoate si chatul cu tine insuti, deci **ramane doar grupul**.
Asa e configurat acum (2026-09-01). Motivul: `SUPPORT_JID` e tot numarul propriu,
deci escaladarile, reamintirile si raspunsurile suportului cadeau in acelasi chat cu
intrebarile — Maria isi citea propriul canal de suport ca pe o discutie cu un client.
Cele doua comutatoare sunt independente:
| `TEST_MODE_SELF_CHAT_ONLY` | `ALLOW_SELF_CHAT` | Unde raspunde Maria |
|---|---|---|
| `true` | `true` | self-chat + grupurile din `ALLOWED_GROUP_JIDS` |
| `true` | `false` | **doar** grupurile din `ALLOWED_GROUP_JIDS` (azi) |
| `false` | `true` | oricine ii scrie pe numarul legat |
| `false` | `false` | oricine, minus self-chat |
Filtrul e in punte (`whatsapp/index.js`), inainte de coada de mesaje: ce se opreste
acolo nu ajunge niciodata la consumer. Se vede in `/status` (`allowSelfChat`) si in
linia de conectare din `logs/whatsapp.log`.
> Cat timp `SUPPORT_JID` e numarul propriu, **trimiterea** catre suport merge in
> continuare (filtrul e doar pe mesajele primite), dar ce raspunzi tu acolo nu mai e
> citit — deci nici completarile, nici `raspuns_om` nu se inregistreaza din
> self-chat. Cand suportul devine un grup sau alt numar, dispare si limita asta.
> **Nu pune aici `echo-test` (`120363424350922235@g.us`).** E canalul WhatsApp al lui
> Echo (LXC 110), iar puntea lui nu filtreaza `fromMe` in grupuri
> (`if (msg.key.fromMe && !isGroup) continue`). Cei doi boti si-ar raspunde unul

View File

@@ -10,6 +10,11 @@ BRIDGE_PORT=8099
# dupa ce esti multumit de calitatea raspunsurilor — altfel Maria raspunde la
# oricine iti scrie pe numarul legat.
TEST_MODE_SELF_CHAT_ONLY=true
# false = Maria nu mai raspunde in chatul cu tine insuti, doar in grupurile din
# ALLOWED_GROUP_JIDS. De pus pe false cand SUPPORT_JID e chiar numarul propriu:
# altfel escaladarile si raspunsurile suportului cad in acelasi chat cu
# intrebarile.
ALLOW_SELF_CHAT=true
# Grupuri in care Maria raspunde chiar si cu self-chat-only (JID-uri, separate prin
# virgula). JID-ul unui grup se citeste din punte: curl -s localhost:8099/groups
# ATENTIE: nu pune un grup in care raspunde si Echo (LXC 110) — puntea lui nu

View File

@@ -28,6 +28,10 @@ const MEDIA_DIR = process.env.MARIA_BRIDGE_DIR
: path.join(__dirname, 'media');
const MAX_RECONNECT_ATTEMPTS = 5;
const TEST_MODE_SELF_CHAT_ONLY = (process.env.TEST_MODE_SELF_CHAT_ONLY || 'true') !== 'false';
// Self-chat-ul e comod la primele teste, dar acolo SUPPORT_JID e chiar propriul
// numar: escaladarile si raspunsurile suportului ajung in acelasi chat cu
// intrebarile clientului. Pe 'false' ramane doar ALLOWED_GROUP_JIDS.
const ALLOW_SELF_CHAT = (process.env.ALLOW_SELF_CHAT || 'true') !== 'false';
// Grupuri in care Maria are voie sa raspunda chiar si in modul self-chat. Testarea
// intr-un grup dedicat scoate zgomotul din chatul „Eu" — dar numai grupurile de
// aici trec, ca sa nu inceapa Maria sa vorbeasca in cele 197 de grupuri ale contului.
@@ -192,7 +196,7 @@ async function startConnection() {
// apare in credentiale dar nu si in remoteJid-ul mesajelor — il taiem.
const rawLid = sock.user?.lid || sock.authState?.creds?.me?.lid || null;
ownLid = rawLid ? `${rawLid.split(':')[0].split('@')[0]}@lid` : null;
console.log(`[whatsapp] Connected as ${phoneNumber} (lid: ${ownLid || 'n/a'}, self-chat-only mode: ${TEST_MODE_SELF_CHAT_ONLY})`);
console.log(`[whatsapp] Connected as ${phoneNumber} (lid: ${ownLid || 'n/a'}, self-chat-only mode: ${TEST_MODE_SELF_CHAT_ONLY}, self-chat: ${ALLOW_SELF_CHAT ? 'da' : 'oprit'}, grupuri: ${[...ALLOWED_GROUP_JIDS].join(', ') || '-'})`);
}
if (connection === 'close') {
@@ -237,6 +241,10 @@ async function startConnection() {
// Mesajele aruncate se logheaza. Fara asta, un JID care nu se potriveste cu
// ownJid (ex. formatul @lid) face bridge-ul sa taca fara nicio urma in log.
const isAllowedGroup = isGroup && ALLOWED_GROUP_JIDS.has(msg.key.remoteJid);
if (isSelfChat && !ALLOW_SELF_CHAT) {
console.log(`[whatsapp] ignorat (self-chat oprit): remoteJid=${msg.key.remoteJid}`);
continue;
}
if (TEST_MODE_SELF_CHAT_ONLY && !isSelfChat && !isAllowedGroup) {
console.log(`[whatsapp] ignorat (nu e self-chat): remoteJid=${msg.key.remoteJid} ownJid=${ownJid} ownLid=${ownLid}`);
continue;
@@ -304,6 +312,7 @@ app.get('/status', (_req, res) => {
connected,
phone: phoneNumber,
selfChatOnly: TEST_MODE_SELF_CHAT_ONLY,
allowSelfChat: ALLOW_SELF_CHAT,
allowedGroups: [...ALLOWED_GROUP_JIDS],
lid: ownLid,
qr: connected ? null : currentQR,