#!/usr/bin/env bash
# Confere se o pareamento do Telegram no OpenClaw ficou gravado certo.
#
# Por que isso existe: em algumas instalacoes o assistente interativo capturou
# as setas do teclado como se fossem texto, e gravou lixo no lugar do seu
# numero de usuario do Telegram. O agente segue funcionando, mas o pareamento
# fica quebrado por baixo.
#
# Nao muda nada. So olha e responde.
#
# Uso, na SUA VPS:  curl -fsSL https://kit.evotero.com.br/checar-allowfrom.sh | bash

set -u

CONFIG="${OPENCLAW_CONFIG:-/root/.openclaw/openclaw.json}"

if [ ! -f "$CONFIG" ]; then
  echo "RESULTADO: nao achei o arquivo de configuracao em $CONFIG"
  echo "Se o teu agente esta em outro lugar, roda de novo assim:"
  echo "  OPENCLAW_CONFIG=/caminho/openclaw.json bash <(curl -fsSL https://kit.evotero.com.br/checar-allowfrom.sh)"
  exit 1
fi

python3 - "$CONFIG" <<'PY'
import json, sys

caminho = sys.argv[1]
try:
    with open(caminho) as f:
        cfg = json.load(f)
except Exception as e:
    print("RESULTADO: nao consegui ler a configuracao (%s)" % e)
    raise SystemExit(1)

def avalia(valor, prefixo=""):
    """Valida pelo que o campo DEVE ser, nao pelo lixo que ele pode conter.

    O lixo do assistente as vezes e o caractere ESC de verdade, as vezes e a
    sequencia \\u001b escrita como texto de seis caracteres. Cacar padrao de
    lixo erra; exigir o formato certo, nao.

    Certo: allowFrom = ["873248252"] · ownerAllowFrom = ["telegram:873248252"]
    """
    if valor is None:
        return "ausente"
    if not isinstance(valor, list) or not valor:
        return "corrompido"
    for item in valor:
        texto = str(item)
        if prefixo:
            if not texto.startswith(prefixo):
                return "corrompido"
            texto = texto[len(prefixo):]
        if not texto.isdigit():
            return "corrompido"
    return "ok"

telegram = (cfg.get("channels") or {}).get("telegram") or {}
campos = (
    ("allowFrom", telegram.get("allowFrom"), ""),
    ("ownerAllowFrom", (cfg.get("commands") or {}).get("ownerAllowFrom"), "telegram:"),
)

ruins = []
for nome, valor, prefixo in campos:
    situacao = avalia(valor, prefixo)
    print("%-16s %s" % (nome, situacao))
    if situacao == "corrompido":
        ruins.append(nome)

print()
if ruins:
    print("RESULTADO: PRECISA CONSERTO (%s)" % ", ".join(ruins))
    print("Manda essa resposta pro Duda que ele te passa o conserto. Teu agente")
    print("continua funcionando; o que quebra e o pareamento por baixo.")
else:
    print("RESULTADO: TUDO CERTO, nao precisa fazer nada.")
PY
