#!/bin/bash

# Buat direktori jika belum ada
directories=(
    "/etc/limit/vmess"
    "/etc/limit/vless"
    "/etc/limit/trojan"
    "/etc/limit/shadowsocks"
)

for dir in "${directories[@]}"; do
    if [[ ! -d $dir ]]; then
        mkdir -p "$dir"
    fi
done

# Fungsi untuk mengonversi ukuran byte ke format lebih mudah dibaca
convert_size() {
    local -i bytes=$1
    if [[ $bytes -lt 1024 ]]; then
        echo "${bytes}B"
    elif [[ $bytes -lt 1048576 ]]; then
        echo "$(((bytes + 1023) / 1024))KB"
    elif [[ $bytes -lt 1073741824 ]]; then
        echo "$(((bytes + 1048575) / 1048576))MB"
    else
        echo "$(((bytes + 1073741823) / 1073741824))GB"
    fi
}

# Fungsi untuk memproses pengguna
process_users() {
    local protocol=$1
    local tag=$2
    local api_port=$3
    local usage_dir="/etc/limit/${protocol}"
    local db_file="/etc/${protocol}/.${protocol}.db"
    local backup_file="/etc/xray/.userall.db"

    # Ambil daftar pengguna berdasarkan tag unik
    local users=($(grep "^$tag" /etc/xray/config.json | cut -d ' ' -f 2 | sort | uniq))

    for user in "${users[@]}"; do
        # Pastikan file data pengguna ada, jika tidak buat file kosong
        if [[ ! -f ${usage_dir}/${user} ]]; then
            touch ${usage_dir}/${user}
        fi

        # Ambil statistik downlink
        downlink_value=$(xray api stats --server=127.0.0.1:${api_port} -name "user>>>${user}>>>traffic>>>downlink" | grep -w "value" | awk '{print $2}' | cut -d '"' -f2)

        if [[ -n ${downlink_value} ]]; then
            # Perbarui penggunaan
            current_usage=$(cat ${usage_dir}/${user})
            new_usage=$((downlink_value + current_usage))
            echo "${new_usage}" > ${usage_dir}/${user}

            # Reset statistik
            xray api stats --server=127.0.0.1:${api_port} -name "user>>>${user}>>>traffic>>>downlink" -reset > /dev/null 2>&1
        else
            echo "Gagal mendapatkan statistik untuk user ${user}."
        fi
    done

    # Proses batas kuota
    for user in "${users[@]}"; do
        limit_file="/etc/${protocol}/${user}"
        limit=$(cat "${limit_file}")
        usage=$(cat ${usage_dir}/${user})

        if [[ ${usage} -gt ${limit} ]]; then
            readable_usage=$(convert_size ${usage})
            readable_limit=$(convert_size ${limit})
            exp=$(grep -w "^$tag $user" /etc/xray/config.json | cut -d ' ' -f 3 | sort | uniq)
            uuid=$(grep -w "^$tag $user" /etc/xray/config.json | cut -d '"' -f 4 | uniq)

            # Backup data pengguna sebelum penghapusan
            sed -i '/#'"${protocol}"'$/a\$tag '"$user $exp $uuid"'' ${backup_file}

            # Hapus user dari config jika melampaui batas
            sed -i "/^$tag $user $exp/,/^},{/d" /etc/xray/config.json

            # Hapus user dari database terkait
            if [[ -f ${db_file} ]]; then
                sed -i "/^ $user $exp/d" ${db_file}
            fi

            # Kirim notifikasi jika bot Telegram diatur
            if [ -f '/etc/bot/.bot.db' ]; then
                source '/etc/bot/.bot.db'
                message="
<b>━━━━━━━━━━━━━━━━━━</b>
<b>🔔 ${protocol^^} NOTIFICATION</b>
<b>🚫 Penggunaan Kuota</b>
<b>━━━━━━━━━━━━━━━━━━</b>
<b>👤 USERNAME :</b> <code>${user}</code>
<b>📊 TOTAL PENGGUNAAN :</b> <code>${readable_usage}</code>
<b>🔒 BATAS PENGGUNAAN :</b> <code>${readable_limit}</code>
<b>━━━━━━━━━━━━━━━━━━</b>
"
                curl -s -X POST "https://api.telegram.org/bot${bot_token}/sendMessage" \
                    -d "chat_id=${telegram_id}" \
                    -d "parse_mode=HTML" \
                    -d "text=${message}"
            else
                echo "Bot Telegram belum diatur. Lewati notifikasi untuk ${user}."
            fi

            # Restart layanan Xray
            if ! systemctl restart xray >/dev/null 2>&1; then
                echo "Peringatan: Gagal merestart layanan Xray."
            fi
        else
            echo "Penggunaan untuk user ${user} masih dalam batas."
        fi
    done
}

# Loop untuk memproses pengguna setiap 5 detik
while true; do
    sleep 5
    process_users "vmess" "###" 10002
    process_users "vless" "#&" 10001
    process_users "trojan" "#!" 10003
    process_users "shadowsocks" "#!#" 10004
done