#!/bin/bash

BASE_URL="https://autoscript.interflazz.my.id/v2"
BRAND="INTERFLAZZ.MY.ID"
WHATSAPP="https://wa.me/6285956131443"
TELEGRAM="https://t.me/interflazz"

json_escape() {
    local value="$1"
    value=${value//\\/\\\\}
    value=${value//\"/\\\"}
    value=${value//$'\n'/\\n}
    value=${value//$'\r'/\\r}
    value=${value//$'\t'/\\t}
    printf '%s' "$value"
}

json_error() {
    local message="$1"

    printf '{\n'
    printf '  "status": "error",\n'
    printf '  "brand": "%s",\n' "$(json_escape "$BRAND")"
    printf '  "message": "%s"\n' "$(json_escape "$message")"
    printf '}\n'

    exit 1
}

show_access_denied() {
    local reason="$1"

    printf '{\n'
    printf '  "status": "error",\n'
    printf '  "brand": "%s",\n' "$(json_escape "$BRAND")"
    printf '  "message": "AKSES DITOLAK!",\n'
    printf '  "detail": "%s",\n' "$(json_escape "$reason")"
    printf '  "ip_vps": "%s",\n' "$(json_escape "$vps_ip")"
    printf '  "suggestion": "Silakan beli izin akses script untuk menggunakan layanan ini.",\n'
    printf '  "contact": {\n'
    printf '    "WhatsApp": "%s",\n' "$(json_escape "$WHATSAPP")"
    printf '    "Telegram": "%s"\n' "$(json_escape "$TELEGRAM")"
    printf '  }\n'
    printf '}\n'

    exit 1
}

get_config_info_123() {
    local config_file="$1"
    local default_value="$2"

    if [ ! -f "$config_file" ]; then
        echo "$default_value"
    else
        cat "$config_file"
    fi
}

generate_username() {
    local protocol="$1"
    local username="$2"
    local config_file

    case "$protocol" in
        ssh)
            config_file="/etc/ssh/.ssh.db"
            ;;
        *)
            config_file="/etc/xray/${protocol}/config.json"
            ;;
    esac

    if [ -f "$config_file" ] && grep -q "^### $username " "$config_file"; then
        local random_number

        random_number=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 5)

        username="${random_number}${username}"
    fi

    echo "$username"
}

validate_username() {
    local username="$1"

    if [[ ${#username} -lt 3 ]]; then
        json_error "Nama pengguna minimal 3 karakter."
    fi

    if ! [[ "$username" =~ ^[a-zA-Z0-9_-]+$ ]]; then
        json_error "Nama pengguna hanya boleh berisi huruf, angka, garis bawah, atau tanda minus."
    fi
}

validate_number() {
    local value="$1"
    local field="$2"

    if ! [[ "$value" =~ ^[0-9]+$ ]]; then
        json_error "$field harus berupa angka."
    fi
}

restart_account_service() {
    local protocol="$1"

    if [ "$protocol" = "ssh" ]; then
        if ! systemctl restart ssh >/dev/null 2>&1; then
            json_error "Akun berhasil dibuat, tetapi layanan SSH gagal dimulai ulang."
        fi
    else
        if ! systemctl restart "${protocol}@config" >/dev/null 2>&1; then
            json_error "Akun berhasil dibuat, tetapi layanan ${protocol} gagal dimulai ulang."
        fi
    fi
}

vps_ip=$(wget -qO- ipv4.icanhazip.com)

if [ -z "$vps_ip" ]; then
    vps_ip=$(curl -4 -s ipv4.icanhazip.com)
fi

if [ -z "$vps_ip" ]; then
    json_error "Gagal mendapatkan IP publik VPS."
fi

data_acc=$(
    curl -s "${BASE_URL}/access" |
        grep "### $vps_ip " |
        awk '{print $3}'
)

if [ -z "$data_acc" ]; then
    show_access_denied "VPS belum memiliki izin akses script."
fi

expiry_date=$(date -d "$data_acc" +%s 2>/dev/null)
current_date=$(date +%s)

if [ -z "$expiry_date" ]; then
    show_access_denied "Data masa aktif script tidak valid."
fi

if [ "$expiry_date" -le "$current_date" ]; then
    show_access_denied "Masa aktif akses script telah berakhir."
fi

remaining_days=$(((expiry_date - current_date) / 86400))

domain=$(get_config_info_123 "/etc/xray/domain" "Domain tidak ditemukan")
ns_domain=$(get_config_info_123 "/etc/xray/dns" "Domain SlowDNS tidak ditemukan")
city=$(get_config_info_123 "/etc/xray/city" "Lokasi tidak ditemukan")
public_key=$(get_config_info_123 "/etc/slowdns/server.pub" "Public Key tidak ditemukan")
ip="$vps_ip"

account_type="${1:-}"

if ! [[ "$account_type" =~ ^(vmess|vless|trojan|shadowsocks|ssh)$ ]]; then
    json_error "Jenis akun tidak valid. Gunakan vmess, vless, trojan, shadowsocks, atau ssh."
fi

mkdir -p \
    /etc/xray/vmess \
    /etc/xray/vless \
    /etc/xray/trojan \
    /etc/xray/shadowsocks \
    /etc/ssh \
    /var/www/html

touch /etc/xray/vmess/.vmess.db
touch /etc/xray/vless/.vless.db
touch /etc/xray/trojan/.trojan.db
touch /etc/xray/shadowsocks/.shadowsocks.db
touch /etc/ssh/.ssh.db

create_vmess_117() {
    local username="$2"
    local duration="$3"
    local quota="$4"
    local ip_limit="$5"
    local uuid
    local expiration_date
    local db_file
    local vmess_tls_link
    local vmess_nontls_link
    local vmess_grpc_link

    validate_username "$username"
    validate_number "$duration" "Masa aktif"
    validate_number "$quota" "Kuota"
    validate_number "$ip_limit" "Batas IP"

    if [ ! -f "/etc/xray/vmess/config.json" ]; then
        json_error "Konfigurasi VMess tidak ditemukan."
    fi

    username=$(generate_username "vmess" "$username")

    uuid=$(cat /proc/sys/kernel/random/uuid)

    expiration_date=$(date -d "$duration days" +"%Y-%m-%d")

    cat >"/etc/xray/vmess/${username}-tls.json" <<EOF
{
    "v": "2",
    "ps": "$username WS (CDN) TLS",
    "add": "${domain}",
    "port": "443",
    "id": "${uuid}",
    "aid": "0",
    "net": "ws",
    "path": "/whatever/vmess",
    "type": "none",
    "host": "${domain}",
    "tls": "tls"
}
EOF

    cat >"/etc/xray/vmess/${username}-non.json" <<EOF
{
    "v": "2",
    "ps": "$username WS (CDN) NTLS",
    "add": "${domain}",
    "port": "80",
    "id": "${uuid}",
    "aid": "0",
    "net": "ws",
    "path": "/whatever/vmess",
    "type": "none",
    "host": "${domain}",
    "tls": "none"
}
EOF

    cat >"/etc/xray/vmess/${username}-grpc.json" <<EOF
{
    "v": "2",
    "ps": "$username (SNI) GRPC",
    "add": "${domain}",
    "port": "443",
    "id": "${uuid}",
    "aid": "0",
    "net": "grpc",
    "path": "vmess-grpc",
    "type": "none",
    "host": "${domain}",
    "tls": "tls"
}
EOF

    if [ ! -s "/etc/xray/vmess/${username}-tls.json" ] ||
       [ ! -s "/etc/xray/vmess/${username}-non.json" ] ||
       [ ! -s "/etc/xray/vmess/${username}-grpc.json" ]; then
        json_error "Gagal membuat konfigurasi akun VMess."
    fi

    vmess_tls_link="vmess://$(base64 -w 0 "/etc/xray/vmess/${username}-tls.json")"
    vmess_nontls_link="vmess://$(base64 -w 0 "/etc/xray/vmess/${username}-non.json")"
    vmess_grpc_link="vmess://$(base64 -w 0 "/etc/xray/vmess/${username}-grpc.json")"

    if ! grep -q '#vmess$' /etc/xray/vmess/config.json; then
        json_error "Marker #vmess tidak ditemukan pada konfigurasi VMess."
    fi

    if ! grep -q '#vmessgrpc$' /etc/xray/vmess/config.json; then
        json_error "Marker #vmessgrpc tidak ditemukan pada konfigurasi VMess."
    fi

    if ! sed -i '/#vmess$/a\### '"$username $expiration_date"'\
},{"id": "'""$uuid""'","alterId": '"0"',"email": "'""$username""'"' /etc/xray/vmess/config.json; then
        json_error "Gagal menambahkan akun VMess ke config.json."
    fi

    if ! sed -i '/#vmessgrpc$/a\### '"$username $expiration_date"'\
},{"id": "'""$uuid""'","alterId": '"0"',"email": "'""$username""'"' /etc/xray/vmess/config.json; then
        json_error "Gagal menambahkan akun VMess gRPC ke config.json."
    fi

    db_file="/etc/xray/vmess/.vmess.db"

    grep -v "^### ${username} " "$db_file" >"${db_file}.tmp"
    mv "${db_file}.tmp" "$db_file"

    echo "### $username $expiration_date $uuid" >>"$db_file"

    if [ "$quota" != "0" ]; then
        echo "$((quota * 1024 * 1024 * 1024))" >"/etc/xray/vmess/${username}"
    else
        rm -f "/etc/xray/vmess/${username}"
    fi

    echo "$ip_limit" >"/etc/xray/vmess/${username}IP"

    cat >"/var/www/html/vmess-${username}.txt" <<EOF
────────────────────────────────────────────
INTERFLAZZ.MY.ID
FORMAT VMESS WS TLS
────────────────────────────────────────────

- name: Vmess-$username-WS-TLS
  type: vmess
  server: ${domain}
  port: 443
  uuid: ${uuid}
  alterId: 0
  cipher: auto
  udp: true
  tls: true
  skip-cert-verify: true
  servername: ${domain}
  network: ws
  ws-opts:
    path: /whatever/vmess
    headers:
      Host: ${domain}

────────────────────────────────────────────
FORMAT VMESS WS NON TLS
────────────────────────────────────────────

- name: Vmess-$username-WS-NonTLS
  type: vmess
  server: ${domain}
  port: 80
  uuid: ${uuid}
  alterId: 0
  cipher: auto
  udp: true
  tls: false
  skip-cert-verify: false
  servername: ${domain}
  network: ws
  ws-opts:
    path: /whatever/vmess
    headers:
      Host: ${domain}

────────────────────────────────────────────
FORMAT VMESS GRPC
────────────────────────────────────────────

- name: Vmess-$username-gRPC
  server: ${domain}
  port: 443
  type: vmess
  uuid: ${uuid}
  alterId: 0
  cipher: auto
  network: grpc
  tls: true
  servername: ${domain}
  skip-cert-verify: true
  grpc-opts:
    grpc-service-name: vmess-grpc

────────────────────────────────────────────
LINK AKUN VMESS
────────────────────────────────────────────

TLS Link
${vmess_tls_link}

────────────────────────────────────────────

Non-TLS Link
${vmess_nontls_link}

────────────────────────────────────────────

gRPC Link
${vmess_grpc_link}

────────────────────────────────────────────
INTERFLAZZ.MY.ID
────────────────────────────────────────────
EOF

    restart_account_service "vmess"

    printf '{\n'
    printf '  "status": "success",\n'
    printf '  "brand": "%s",\n' "$BRAND"
    printf '  "message": "Akun VMess berhasil dibuat.",\n'
    printf '  "data": {\n'
    printf '    "username": "%s",\n' "$(json_escape "$username")"
    printf '    "kadaluarsa": "%s",\n' "$expiration_date"
    printf '    "uuid": "%s",\n' "$uuid"

    if [ "$quota" = "0" ]; then
        printf '    "quota": "Tanpa Batas",\n'
    else
        printf '    "quota": "%s GB",\n' "$quota"
    fi

    if [ "$ip_limit" = "0" ]; then
        printf '    "ip_limit": "Tanpa Batas",\n'
    else
        printf '    "ip_limit": "%s",\n' "$ip_limit"
    fi

    printf '    "domain": "%s",\n' "$(json_escape "$domain")"
    printf '    "ns_domain": "%s",\n' "$(json_escape "$ns_domain")"
    printf '    "city": "%s",\n' "$(json_escape "$city")"
    printf '    "pubkey": "%s",\n' "$(json_escape "$public_key")"
    printf '    "vmess_tls_link": "%s",\n' "$(json_escape "$vmess_tls_link")"
    printf '    "vmess_nontls_link": "%s",\n' "$(json_escape "$vmess_nontls_link")"
    printf '    "vmess_grpc_link": "%s",\n' "$(json_escape "$vmess_grpc_link")"
    printf '    "openclash": "https://%s:81/vmess-%s.txt"\n' "$(json_escape "$domain")" "$(json_escape "$username")"
    printf '  }\n'
    printf '}\n'
}

create_vless_121() {
    local username="$2"
    local duration="$3"
    local quota="$4"
    local ip_limit="$5"
    local uuid
    local expiration_date
    local db_file
    local vless_tls_link
    local vless_nontls_link
    local vless_grpc_link

    validate_username "$username"
    validate_number "$duration" "Masa aktif"
    validate_number "$quota" "Kuota"
    validate_number "$ip_limit" "Batas IP"

    if [ ! -f "/etc/xray/vless/config.json" ]; then
        json_error "Konfigurasi VLESS tidak ditemukan."
    fi

    username=$(generate_username "vless" "$username")

    uuid=$(cat /proc/sys/kernel/random/uuid)

    expiration_date=$(date -d "$duration days" +"%Y-%m-%d")

    vless_tls_link="vless://${uuid}@${domain}:443?path=/whatever/vless&security=tls&encryption=none&host=${domain}&type=ws&sni=${domain}#${username}-WS-TLS"

    vless_nontls_link="vless://${uuid}@${domain}:80?path=/whatever/vless&encryption=none&host=${domain}&type=ws#${username}-WS-NTLS"

    vless_grpc_link="vless://${uuid}@${domain}:443?mode=gun&security=tls&encryption=none&type=grpc&serviceName=vless-grpc&sni=${domain}#${username}-gRPC"

    if ! grep -q '#vless$' /etc/xray/vless/config.json; then
        json_error "Marker #vless tidak ditemukan pada konfigurasi VLESS."
    fi

    if ! grep -q '#vlessgrpc$' /etc/xray/vless/config.json; then
        json_error "Marker #vlessgrpc tidak ditemukan pada konfigurasi VLESS."
    fi

    if ! sed -i '/#vless$/a\### '"$username $expiration_date"'\
},{"id": "'""$uuid""'","email": "'""$username""'"' /etc/xray/vless/config.json; then
        json_error "Gagal menambahkan akun VLESS ke config.json."
    fi

    if ! sed -i '/#vlessgrpc$/a\### '"$username $expiration_date"'\
},{"id": "'""$uuid""'","email": "'""$username""'"' /etc/xray/vless/config.json; then
        json_error "Gagal menambahkan akun VLESS gRPC ke config.json."
    fi

    db_file="/etc/xray/vless/.vless.db"

    grep -v "^### ${username} " "$db_file" >"${db_file}.tmp"
    mv "${db_file}.tmp" "$db_file"

    echo "### $username $expiration_date $uuid" >>"$db_file"

    if [ "$quota" != "0" ]; then
        echo "$((quota * 1024 * 1024 * 1024))" >"/etc/xray/vless/${username}"
    else
        rm -f "/etc/xray/vless/${username}"
    fi

    echo "$ip_limit" >"/etc/xray/vless/${username}IP"

    cat >"/var/www/html/vless-${username}.txt" <<EOF
────────────────────────────────────────────
INTERFLAZZ.MY.ID
FORMAT VLESS WS TLS
────────────────────────────────────────────

- name: Vless-$username-WS-TLS
  type: vless
  server: ${domain}
  port: 443
  uuid: ${uuid}
  cipher: auto
  udp: true
  tls: true
  skip-cert-verify: true
  servername: ${domain}
  network: ws
  ws-opts:
    path: /whatever/vless
    headers:
      Host: ${domain}

────────────────────────────────────────────
FORMAT VLESS WS NON TLS
────────────────────────────────────────────

- name: Vless-$username-WS-NonTLS
  type: vless
  server: ${domain}
  port: 80
  uuid: ${uuid}
  cipher: auto
  udp: true
  tls: false
  skip-cert-verify: false
  servername: ${domain}
  network: ws
  ws-opts:
    path: /whatever/vless
    headers:
      Host: ${domain}

────────────────────────────────────────────
FORMAT VLESS GRPC
────────────────────────────────────────────

- name: Vless-$username-gRPC
  server: ${domain}
  port: 443
  type: vless
  uuid: ${uuid}
  cipher: auto
  network: grpc
  tls: true
  servername: ${domain}
  skip-cert-verify: true
  grpc-opts:
    grpc-service-name: vless-grpc

────────────────────────────────────────────
LINK AKUN VLESS
────────────────────────────────────────────

TLS Link
${vless_tls_link}

────────────────────────────────────────────

Non-TLS Link
${vless_nontls_link}

────────────────────────────────────────────

gRPC Link
${vless_grpc_link}

────────────────────────────────────────────
INTERFLAZZ.MY.ID
────────────────────────────────────────────
EOF

    restart_account_service "vless"

    printf '{\n'
    printf '  "status": "success",\n'
    printf '  "brand": "%s",\n' "$BRAND"
    printf '  "message": "Akun VLESS berhasil dibuat.",\n'
    printf '  "data": {\n'
    printf '    "username": "%s",\n' "$(json_escape "$username")"
    printf '    "kadaluarsa": "%s",\n' "$expiration_date"
    printf '    "uuid": "%s",\n' "$uuid"

    if [ "$quota" = "0" ]; then
        printf '    "quota": "Tanpa Batas",\n'
    else
        printf '    "quota": "%s GB",\n' "$quota"
    fi

    if [ "$ip_limit" = "0" ]; then
        printf '    "ip_limit": "Tanpa Batas",\n'
    else
        printf '    "ip_limit": "%s",\n' "$ip_limit"
    fi

    printf '    "domain": "%s",\n' "$(json_escape "$domain")"
    printf '    "ns_domain": "%s",\n' "$(json_escape "$ns_domain")"
    printf '    "city": "%s",\n' "$(json_escape "$city")"
    printf '    "pubkey": "%s",\n' "$(json_escape "$public_key")"
    printf '    "vless_tls_link": "%s",\n' "$(json_escape "$vless_tls_link")"
    printf '    "vless_nontls_link": "%s",\n' "$(json_escape "$vless_nontls_link")"
    printf '    "vless_grpc_link": "%s",\n' "$(json_escape "$vless_grpc_link")"
    printf '    "openclash": "https://%s:81/vless-%s.txt"\n' "$(json_escape "$domain")" "$(json_escape "$username")"
    printf '  }\n'
    printf '}\n'
}

create_trojan_125() {
    local username="$2"
    local duration="$3"
    local quota="$4"
    local ip_limit="$5"
    local uuid
    local expiration_date
    local db_file
    local trojan_tls_link
    local trojan_grpc_link

    validate_username "$username"
    validate_number "$duration" "Masa aktif"
    validate_number "$quota" "Kuota"
    validate_number "$ip_limit" "Batas IP"

    if [ ! -f "/etc/xray/trojan/config.json" ]; then
        json_error "Konfigurasi Trojan tidak ditemukan."
    fi

    username=$(generate_username "trojan" "$username")

    uuid=$(cat /proc/sys/kernel/random/uuid)

    expiration_date=$(date -d "$duration days" +"%Y-%m-%d")

    trojan_tls_link="trojan://${uuid}@${domain}:443?path=%2Fwhatever%2Ftrojan-ws&security=tls&host=${domain}&type=ws&sni=${domain}#${username}"

    trojan_grpc_link="trojan://${uuid}@${domain}:443?mode=gun&security=tls&type=grpc&serviceName=trojan-grpc&sni=${domain}#${username}"

    if ! grep -q '#trojan$' /etc/xray/trojan/config.json; then
        json_error "Marker #trojan tidak ditemukan pada konfigurasi Trojan."
    fi

    if ! grep -q '#trojangrpc$' /etc/xray/trojan/config.json; then
        json_error "Marker #trojangrpc tidak ditemukan pada konfigurasi Trojan."
    fi

    if ! sed -i '/#trojan$/a\### '"$username $expiration_date"'\
},{"password": "'""$uuid""'","email": "'""$username""'"' /etc/xray/trojan/config.json; then
        json_error "Gagal menambahkan akun Trojan ke config.json."
    fi

    if ! sed -i '/#trojangrpc$/a\### '"$username $expiration_date"'\
},{"password": "'""$uuid""'","email": "'""$username""'"' /etc/xray/trojan/config.json; then
        json_error "Gagal menambahkan akun Trojan gRPC ke config.json."
    fi

    db_file="/etc/xray/trojan/.trojan.db"

    grep -v "^### ${username} " "$db_file" >"${db_file}.tmp"
    mv "${db_file}.tmp" "$db_file"

    echo "### $username $expiration_date $uuid" >>"$db_file"

    if [ "$quota" != "0" ]; then
        echo "$((quota * 1024 * 1024 * 1024))" >"/etc/xray/trojan/${username}"
    else
        rm -f "/etc/xray/trojan/${username}"
    fi

    echo "$ip_limit" >"/etc/xray/trojan/${username}IP"

    cat >"/var/www/html/trojan-${username}.txt" <<EOF
────────────────────────────────────────────
INTERFLAZZ.MY.ID
FORMAT TROJAN WS TLS
────────────────────────────────────────────

- name: Trojan-$username-WS-TLS
  type: trojan
  server: ${domain}
  port: 443
  password: ${uuid}
  udp: true
  sni: ${domain}
  skip-cert-verify: true
  network: ws
  ws-opts:
    path: /whatever/trojan-ws
    headers:
      Host: ${domain}

────────────────────────────────────────────
FORMAT TROJAN WS NON TLS
────────────────────────────────────────────

- name: Trojan-$username-WS-NonTLS
  type: trojan
  server: ${domain}
  port: 80
  password: ${uuid}
  udp: true
  sni: ${domain}
  skip-cert-verify: false
  network: ws
  ws-opts:
    path: /whatever/trojan-ws
    headers:
      Host: ${domain}

────────────────────────────────────────────
FORMAT TROJAN GRPC
────────────────────────────────────────────

- name: Trojan-$username-gRPC
  server: ${domain}
  port: 443
  type: trojan
  password: ${uuid}
  network: grpc
  sni: ${domain}
  skip-cert-verify: true
  grpc-opts:
    grpc-service-name: trojan-grpc

────────────────────────────────────────────
LINK AKUN TROJAN
────────────────────────────────────────────

TLS Link
${trojan_tls_link}

────────────────────────────────────────────

gRPC Link
${trojan_grpc_link}

────────────────────────────────────────────
INTERFLAZZ.MY.ID
────────────────────────────────────────────
EOF

    restart_account_service "trojan"

    printf '{\n'
    printf '  "status": "success",\n'
    printf '  "brand": "%s",\n' "$BRAND"
    printf '  "message": "Akun Trojan berhasil dibuat.",\n'
    printf '  "data": {\n'
    printf '    "username": "%s",\n' "$(json_escape "$username")"
    printf '    "kadaluarsa": "%s",\n' "$expiration_date"
    printf '    "uuid": "%s",\n' "$uuid"

    if [ "$quota" = "0" ]; then
        printf '    "quota": "Tanpa Batas",\n'
    else
        printf '    "quota": "%s GB",\n' "$quota"
    fi

    if [ "$ip_limit" = "0" ]; then
        printf '    "ip_limit": "Tanpa Batas",\n'
    else
        printf '    "ip_limit": "%s",\n' "$ip_limit"
    fi

    printf '    "domain": "%s",\n' "$(json_escape "$domain")"
    printf '    "ns_domain": "%s",\n' "$(json_escape "$ns_domain")"
    printf '    "city": "%s",\n' "$(json_escape "$city")"
    printf '    "pubkey": "%s",\n' "$(json_escape "$public_key")"
    printf '    "trojan_tls_link": "%s",\n' "$(json_escape "$trojan_tls_link")"
    printf '    "trojan_grpc_link": "%s",\n' "$(json_escape "$trojan_grpc_link")"
    printf '    "openclash": "https://%s:81/trojan-%s.txt"\n' "$(json_escape "$domain")" "$(json_escape "$username")"
    printf '  }\n'
    printf '}\n'
}

create_shadowsocks_128() {
    local username="$2"
    local duration="$3"
    local quota="$4"
    local ip_limit="$5"
    local password
    local method="aes-256-gcm"
    local expiration_date
    local encoded_credentials
    local ss_link_ws
    local ss_link_grpc
    local db_file

    validate_username "$username"
    validate_number "$duration" "Masa aktif"
    validate_number "$quota" "Kuota"
    validate_number "$ip_limit" "Batas IP"

    if [ ! -f "/etc/xray/shadowsocks/config.json" ]; then
        json_error "Konfigurasi Shadowsocks tidak ditemukan."
    fi

    username=$(generate_username "shadowsocks" "$username")

    password=$(cat /proc/sys/kernel/random/uuid)

    expiration_date=$(date -d "$duration days" +"%Y-%m-%d")

    encoded_credentials=$(echo -n "${method}:${password}" | base64 -w 0)

    ss_link_ws="ss://${encoded_credentials}@${domain}:443?plugin=xray-plugin;mux=0;path=/ss-ws;host=${domain};tls;network=ws;host=${domain}#${username}-WS"

    ss_link_grpc="ss://${encoded_credentials}@${domain}:443?plugin=xray-plugin;mux=0;serviceName=ss-grpc;host=${domain};tls#${username}-gRPC"

    if ! grep -q '#ssws$' /etc/xray/shadowsocks/config.json; then
        json_error "Marker #ssws tidak ditemukan pada konfigurasi Shadowsocks."
    fi

    if ! grep -q '#ssgrpc$' /etc/xray/shadowsocks/config.json; then
        json_error "Marker #ssgrpc tidak ditemukan pada konfigurasi Shadowsocks."
    fi

    if ! sed -i '/#ssws$/a\### '"$username $expiration_date"'\
},{"password": "'""$password""'","method": "'""$method""'","email": "'""$username""'"' /etc/xray/shadowsocks/config.json; then
        json_error "Gagal menambahkan akun Shadowsocks ke config.json."
    fi

    if ! sed -i '/#ssgrpc$/a\### '"$username $expiration_date"'\
},{"password": "'""$password""'","method": "'""$method""'","email": "'""$username""'"' /etc/xray/shadowsocks/config.json; then
        json_error "Gagal menambahkan akun Shadowsocks gRPC ke config.json."
    fi

    db_file="/etc/xray/shadowsocks/.shadowsocks.db"

    grep -v "^### ${username} " "$db_file" >"${db_file}.tmp"
    mv "${db_file}.tmp" "$db_file"

    echo "### $username $expiration_date $password" >>"$db_file"

    if [ "$quota" != "0" ]; then
        echo "$((quota * 1024 * 1024 * 1024))" >"/etc/xray/shadowsocks/${username}"
    else
        rm -f "/etc/xray/shadowsocks/${username}"
    fi

    echo "$ip_limit" >"/etc/xray/shadowsocks/${username}IP"

    cat >"/var/www/html/shadowsocks-${username}.txt" <<EOF
────────────────────────────────────────────
INTERFLAZZ.MY.ID
FORMAT SHADOWSOCKS WS
────────────────────────────────────────────

{
  "dns": {
    "servers": [
      "8.8.8.8",
      "8.8.4.4"
    ]
  },
  "inbounds": [
    {
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true,
        "userLevel": 8
      },
      "sniffing": {
        "destOverride": [
          "http",
          "tls"
        ],
        "enabled": true
      },
      "tag": "socks"
    },
    {
      "port": 10809,
      "protocol": "http",
      "settings": {
        "userLevel": 8
      },
      "tag": "http"
    }
  ],
  "log": {
    "loglevel": "none"
  },
  "outbounds": [
    {
      "mux": {
        "enabled": true
      },
      "protocol": "shadowsocks",
      "settings": {
        "servers": [
          {
            "address": "$domain",
            "level": 8,
            "method": "$method",
            "password": "$password",
            "port": 443
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "allowInsecure": true,
          "serverName": "$domain"
        },
        "wsSettings": {
          "headers": {
            "Host": "$domain"
          },
          "path": "/whatever/ss-ws"
        }
      },
      "tag": "proxy"
    },
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "http"
        }
      },
      "tag": "block"
    }
  ],
  "policy": {
    "levels": {
      "8": {
        "connIdle": 300,
        "downlinkOnly": 1,
        "handshake": 4,
        "uplinkOnly": 1
      }
    },
    "system": {
      "statsOutboundUplink": true,
      "statsOutboundDownlink": true
    }
  },
  "routing": {
    "domainStrategy": "AsIs",
    "rules": []
  },
  "stats": {}
}

────────────────────────────────────────────
FORMAT SHADOWSOCKS GRPC
────────────────────────────────────────────

{
  "dns": {
    "servers": [
      "8.8.8.8",
      "8.8.4.4"
    ]
  },
  "inbounds": [
    {
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true,
        "userLevel": 8
      },
      "sniffing": {
        "destOverride": [
          "http",
          "tls"
        ],
        "enabled": true
      },
      "tag": "socks"
    },
    {
      "port": 10809,
      "protocol": "http",
      "settings": {
        "userLevel": 8
      },
      "tag": "http"
    }
  ],
  "log": {
    "loglevel": "none"
  },
  "outbounds": [
    {
      "mux": {
        "enabled": true
      },
      "protocol": "shadowsocks",
      "settings": {
        "servers": [
          {
            "address": "$domain",
            "level": 8,
            "method": "$method",
            "password": "$password",
            "port": 443
          }
        ]
      },
      "streamSettings": {
        "grpcSettings": {
          "multiMode": true,
          "serviceName": "ss-grpc"
        },
        "network": "grpc",
        "security": "tls",
        "tlsSettings": {
          "allowInsecure": true,
          "serverName": "$domain"
        }
      },
      "tag": "proxy"
    },
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "http"
        }
      },
      "tag": "block"
    }
  ],
  "policy": {
    "levels": {
      "8": {
        "connIdle": 300,
        "downlinkOnly": 1,
        "handshake": 4,
        "uplinkOnly": 1
      }
    },
    "system": {
      "statsOutboundUplink": true,
      "statsOutboundDownlink": true
    }
  },
  "routing": {
    "domainStrategy": "AsIs",
    "rules": []
  },
  "stats": {}
}

────────────────────────────────────────────
LINK AKUN SHADOWSOCKS
────────────────────────────────────────────

WS Link
${ss_link_ws}

────────────────────────────────────────────

gRPC Link
${ss_link_grpc}

────────────────────────────────────────────
INTERFLAZZ.MY.ID
────────────────────────────────────────────
EOF

    restart_account_service "shadowsocks"

    printf '{\n'
    printf '  "status": "success",\n'
    printf '  "brand": "%s",\n' "$BRAND"
    printf '  "message": "Akun Shadowsocks berhasil dibuat.",\n'
    printf '  "data": {\n'
    printf '    "username": "%s",\n' "$(json_escape "$username")"
    printf '    "kadaluarsa": "%s",\n' "$expiration_date"
    printf '    "password": "%s",\n' "$(json_escape "$password")"
    printf '    "method": "%s",\n' "$method"

    if [ "$quota" = "0" ]; then
        printf '    "quota": "Tanpa Batas",\n'
    else
        printf '    "quota": "%s GB",\n' "$quota"
    fi

    if [ "$ip_limit" = "0" ]; then
        printf '    "ip_limit": "Tanpa Batas",\n'
    else
        printf '    "ip_limit": "%s",\n' "$ip_limit"
    fi

    printf '    "domain": "%s",\n' "$(json_escape "$domain")"
    printf '    "ns_domain": "%s",\n' "$(json_escape "$ns_domain")"
    printf '    "city": "%s",\n' "$(json_escape "$city")"
    printf '    "pubkey": "%s",\n' "$(json_escape "$public_key")"
    printf '    "ss_link_ws": "%s",\n' "$(json_escape "$ss_link_ws")"
    printf '    "ss_link_grpc": "%s",\n' "$(json_escape "$ss_link_grpc")"
    printf '    "config": "https://%s:81/shadowsocks-%s.txt"\n' "$(json_escape "$domain")" "$(json_escape "$username")"
    printf '  }\n'
    printf '}\n'
}

create_ssh_134() {
    local username="$2"
    local password="$3"
    local duration="$4"
    local ip_limit="$5"
    local expiration_date

    validate_username "$username"

    if [[ ${#password} -lt 3 ]]; then
        json_error "Password minimal 3 karakter."
    fi

    if ! [[ "$password" =~ ^[a-zA-Z0-9_-]+$ ]]; then
        json_error "Password hanya boleh berisi huruf, angka, garis bawah, atau tanda minus."
    fi

    validate_number "$duration" "Masa aktif"
    validate_number "$ip_limit" "Batas IP"

    username=$(generate_username "ssh" "$username")

    expiration_date=$(date -d "$duration days" +"%Y-%m-%d")

    if id "$username" >/dev/null 2>&1; then
        username="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 5)${username}"
    fi

    if ! useradd \
        -e "$expiration_date" \
        -s /bin/false \
        -M "$username" \
        >/dev/null 2>&1; then

        json_error "Gagal membuat pengguna SSH."
    fi

    if ! printf "%s\n%s\n" "$password" "$password" |
        passwd "$username" >/dev/null 2>&1; then

        userdel "$username" >/dev/null 2>&1

        json_error "Gagal mengatur password akun SSH."
    fi

    if [ "$ip_limit" != "0" ]; then
        echo "$ip_limit" >"/etc/ssh/${username}"
    else
        rm -f "/etc/ssh/${username}"
    fi

    grep -v "^### ${username} " /etc/ssh/.ssh.db >/etc/ssh/.ssh.db.tmp

    mv /etc/ssh/.ssh.db.tmp /etc/ssh/.ssh.db

    echo "### $username $expiration_date" >>/etc/ssh/.ssh.db

    cat >"/var/www/html/ssh-${username}.txt" <<EOF
────────────────────────────────────────────
INTERFLAZZ.MY.ID
AKUN SSH / OPENVPN
────────────────────────────────────────────

Username         : $username
Password         : $password

────────────────────────────────────────────

IP               : $ip
Host             : $domain
SlowDNS Host     : ${ns_domain}
Public Key       : ${public_key}
Lokasi           : $city

────────────────────────────────────────────

OpenSSH Port     : 443, 80, 22
UdpSSH Port      : 1-65535
DNS Port         : 443, 53, 22
Dropbear Port    : 443, 109
Dropbear WS Port : 443, 109
SSH WS Port      : 80
SSH SSL WS Port  : 443
SSL/TLS Port     : 443
OVPN WS SSL Port : 443
OVPN SSL Port    : 443
OVPN TCP Port    : 443, 1194
OVPN UDP Port    : 2200
BadVPN UDP       : 7100, 7300, 7300

────────────────────────────────────────────

WSS Payload
GET wss://BUG.COM/ HTTP/1.1[crlf]Host: $domain[crlf]Upgrade: websocket[crlf][crlf]

────────────────────────────────────────────

OpenVPN
https://$domain:81/allovpn.zip

────────────────────────────────────────────

Simpan Akun
https://$domain:81/ssh-$username.txt

────────────────────────────────────────────

Batas IP         : $ip_limit
Masa Aktif       : $duration Hari
Kadaluarsa       : $expiration_date

────────────────────────────────────────────
INTERFLAZZ.MY.ID
────────────────────────────────────────────
EOF

    restart_account_service "ssh"

    printf '{\n'
    printf '  "status": "success",\n'
    printf '  "brand": "%s",\n' "$BRAND"
    printf '  "message": "Akun SSH berhasil dibuat.",\n'
    printf '  "data": {\n'
    printf '    "username": "%s",\n' "$(json_escape "$username")"
    printf '    "password": "%s",\n' "$(json_escape "$password")"
    printf '    "kadaluarsa": "%s",\n' "$expiration_date"

    if [ "$ip_limit" = "0" ]; then
        printf '    "ip_limit": "Tanpa Batas",\n'
    else
        printf '    "ip_limit": "%s",\n' "$ip_limit"
    fi

    printf '    "ip": "%s",\n' "$(json_escape "$ip")"
    printf '    "domain": "%s",\n' "$(json_escape "$domain")"
    printf '    "ns_domain": "%s",\n' "$(json_escape "$ns_domain")"
    printf '    "city": "%s",\n' "$(json_escape "$city")"
    printf '    "pubkey": "%s",\n' "$(json_escape "$public_key")"
    printf '    "openvpn": "https://%s:81/allovpn.zip",\n' "$(json_escape "$domain")"
    printf '    "config": "https://%s:81/ssh-%s.txt"\n' "$(json_escape "$domain")" "$(json_escape "$username")"
    printf '  }\n'
    printf '}\n'
}

case "$account_type" in
    vmess)
        [ "$#" -lt 5 ] &&
            json_error "Format: vmess username masa_aktif quota batas_ip"

        create_vmess_117 "$1" "$2" "$3" "$4" "$5"
        ;;

    vless)
        [ "$#" -lt 5 ] &&
            json_error "Format: vless username masa_aktif quota batas_ip"

        create_vless_121 "$1" "$2" "$3" "$4" "$5"
        ;;

    trojan)
        [ "$#" -lt 5 ] &&
            json_error "Format: trojan username masa_aktif quota batas_ip"

        create_trojan_125 "$1" "$2" "$3" "$4" "$5"
        ;;

    shadowsocks)
        [ "$#" -lt 5 ] &&
            json_error "Format: shadowsocks username masa_aktif quota batas_ip"

        create_shadowsocks_128 "$1" "$2" "$3" "$4" "$5"
        ;;

    ssh)
        [ "$#" -lt 5 ] &&
            json_error "Format: ssh username password masa_aktif batas_ip"

        create_ssh_134 "$1" "$2" "$3" "$4" "$5"
        ;;

    *)
        json_error "Jenis akun tidak valid."
        ;;
esac