#!/system/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only
# Zapret2 integration for AISprut (2026). Works with magisk-zapret2 v2.3.6 scripts
# (AGPL-3.0-only) and bol-van/zapret2 nfqws2 (MIT). See LICENSES/NOTICE.md
# AISprut (with Zapret2 inside): pin the module and data paths
# for every aisctl call (WebUI, service, action, uninstall), and hand the
# panel's Zapret2 requests ("z2.*") to the Zapret2 backend and the
# Чебурнет requests ("cb.*") to cbnet.sh, the Telegram reserve proxy ("tgx.*")
# to tgx.sh, hotspot sharing ("hsx.*") to hsx.sh, notification status/QR pictures ("nfx.*") to nfx.sh,
# encrypted subscription links ("sbx.*") to subx.sh, module components
# ("mod.*") to modx.sh.
AIS_MODDIR=/data/adb/modules/AISprut
AIS_DATA=/data/adb/AISprut
export AIS_MODDIR AIS_DATA

# 4.8.3: while Чебурнет has switched AISprut into "everything through the
# tunnel", the panel must not overwrite the settings Чебурнет keeps for later
# (they would be lost when it switches back). Requests to change them are
# refused with an explanation; everything else passes. Чебурнет itself talks to
# bin/aisctl directly and is not affected.
CB_SNAPKEYS='"(app_mode|apps|ai_enabled|groups|bypass_ru|tunnel_net|tg_transparent|tg_ws|selected_node|tunnel_on)":'
cb_guard() { # $1 = base64 payload
    [ -f /data/adb/cheburnet/active ] || return 0
    case "$1" in eyJjbWQiOiJzZXR0aW5ncy5zZXQi*) ;; *) return 0 ;; esac
    printf '%s' "$1" | base64 -d 2>/dev/null | grep -qE "$CB_SNAPKEYS" || return 0
    printf '%s\n' '{"ok":false,"error":"Сейчас действует режим Чебурнет: приложения, группы, сервер и обход ИИ временно заданы им и вернутся сами, когда обычный интернет восстановится. Чтобы изменить их сейчас, включите в разделе Чебурнет «Обычный интернет» (принудительно)."}'
    exit 0
}

if [ "$1" = api ]; then
    # base64 of '{"cmd":"z2.' starts with eyJjbWQiOiJ6Mi5 — recognised without
    # decoding, so AISprut's own frequent calls pay no extra processes
    if [ "$2" = - ]; then
        P="$(cat)"
        case "$P" in
            eyJjbWQiOiJ6Mi5*) exec /system/bin/sh "$AIS_MODDIR/z2ctl.sh" "$(printf '%s' "$P" | base64 -d 2>/dev/null)" ;;
            eyJjbWQiOiJjYi5*) exec /system/bin/sh "$AIS_MODDIR/cbnet.sh" "$(printf '%s' "$P" | base64 -d 2>/dev/null)" ;;
            eyJjbWQiOiJ0Z3gu*) exec /system/bin/sh "$AIS_MODDIR/tgx.sh" "$(printf '%s' "$P" | base64 -d 2>/dev/null)" ;;
            eyJjbWQiOiJoc3gu*) exec /system/bin/sh "$AIS_MODDIR/hsx.sh" "$(printf '%s' "$P" | base64 -d 2>/dev/null)" ;;
            eyJjbWQiOiJuZngu*) exec /system/bin/sh "$AIS_MODDIR/nfx.sh" "$(printf '%s' "$P" | base64 -d 2>/dev/null)" ;;
            eyJjbWQiOiJzYngu*) exec /system/bin/sh "$AIS_MODDIR/subx.sh" "$(printf '%s' "$P" | base64 -d 2>/dev/null)" ;;
            eyJjbWQiOiJtb2Qu*) exec /system/bin/sh "$AIS_MODDIR/modx.sh" "$(printf '%s' "$P" | base64 -d 2>/dev/null)" ;;
        esac
        cb_guard "$P"
        printf '%s' "$P" | exec "$AIS_MODDIR/bin/aisctl" api -
    fi
    case "$2" in
        eyJjbWQiOiJ6Mi5*) exec /system/bin/sh "$AIS_MODDIR/z2ctl.sh" "$(printf '%s' "$2" | base64 -d 2>/dev/null)" ;;
        eyJjbWQiOiJjYi5*) exec /system/bin/sh "$AIS_MODDIR/cbnet.sh" "$(printf '%s' "$2" | base64 -d 2>/dev/null)" ;;
        eyJjbWQiOiJ0Z3gu*) exec /system/bin/sh "$AIS_MODDIR/tgx.sh" "$(printf '%s' "$2" | base64 -d 2>/dev/null)" ;;
        eyJjbWQiOiJoc3gu*) exec /system/bin/sh "$AIS_MODDIR/hsx.sh" "$(printf '%s' "$2" | base64 -d 2>/dev/null)" ;;
        eyJjbWQiOiJuZngu*) exec /system/bin/sh "$AIS_MODDIR/nfx.sh" "$(printf '%s' "$2" | base64 -d 2>/dev/null)" ;;
        eyJjbWQiOiJzYngu*) exec /system/bin/sh "$AIS_MODDIR/subx.sh" "$(printf '%s' "$2" | base64 -d 2>/dev/null)" ;;
        eyJjbWQiOiJtb2Qu*) exec /system/bin/sh "$AIS_MODDIR/modx.sh" "$(printf '%s' "$2" | base64 -d 2>/dev/null)" ;;
        eyJjbWQiOiJzZXR0aW5ncy5zZXQi*) cb_guard "$2" ;;
    esac
fi
exec "$AIS_MODDIR/bin/aisctl" "$@"
