#!/bin/bash

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

ACCESS_LOG="/var/log/xray/access.log"
LIMIT_LOG="/var/log/xray/ip_limit.log"
ROTATION_DIR="/tmp/interflazz_limitip"
INTERVAL_MINUTES="${1:-1}"

if ! [[ "$INTERVAL_MINUTES" =~ ^[0-9]+$ ]] || [ "$INTERVAL_MINUTES" -lt 1 ]; then
    INTERVAL_MINUTES=1
fi

mkdir -p "$ROTATION_DIR"
mkdir -p /var/log/xray
touch "$LIMIT_LOG"

get_vps_ip() {
    vps_ip=$(wget -qO- --timeout=5 ipv4.icanhazip.com 2>/dev/null)

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

    if [ -z "$vps_ip" ]; then
        vps_ip="Tidak diketahui"
    fi
}

check_access() {
    get_vps_ip

    if [ "$vps_ip" = "Tidak diketahui" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Gagal mendapatkan IP VPS." >> "$LIMIT_LOG"
        return 1
    fi

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

    if [ -z "$data_acc" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Akses ditolak untuk IP $vps_ip." >> "$LIMIT_LOG"
        return 1
    fi

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

    if [ -z "$expiry_date" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Data masa aktif akses tidak valid." >> "$LIMIT_LOG"
        return 1
    fi

    if [ "$expiry_date" -le "$current_date" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Masa aktif script untuk IP $vps_ip telah berakhir." >> "$LIMIT_LOG"
        return 1
    fi

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

    return 0
}

send_telegram() {
    local protocol="$1"
    local user="$2"
    local ip_count="$3"
    local ip_limit="$4"
    local ip_list="$5"

    if [ -z "${bot_token:-}" ] || [ -z "${telegram_id:-}" ]; then
        return 1
    fi

    local protocol_name
    protocol_name=$(echo "$protocol" | tr '[:lower:]' '[:upper:]')

    local message

    message="<b>━━━━━━━━━━━━━━━━━━</b>
<b>🔔 ${BRAND}</b>
<b>🚫 MULTI LOGIN ${protocol_name}</b>
<b>━━━━━━━━━━━━━━━━━━</b>
<b>👤 Username :</b> <code>${user}</code>
<b>📊 Total IP :</b> <code>${ip_count}</code>
<b>🔒 Batas IP :</b> <code>${ip_limit}</code>
<b>🌐 IP Aktif :</b>
<code>${ip_list}</code>
<b>━━━━━━━━━━━━━━━━━━</b>
<b>🌐 IP VPS :</b> <code>${vps_ip}</code>
<b>⏳ Akses Script :</b> <code>${remaining_days} Hari</code>
<b>━━━━━━━━━━━━━━━━━━</b>
<b>INTERFLAZZ.MY.ID</b>"

    curl -s --max-time 15 \
        -X POST "https://api.telegram.org/bot${bot_token}/sendMessage" \
        --data-urlencode "chat_id=${telegram_id}" \
        --data-urlencode "parse_mode=HTML" \
        --data-urlencode "text=${message}" \
        >/dev/null 2>&1
}

get_protocol_users() {
    local protocol="$1"
    local db_file="/etc/xray/${protocol}/.${protocol}.db"

    if [ ! -f "$db_file" ]; then
        return
    fi

    grep '^### ' "$db_file" 2>/dev/null |
        awk '{print $2}' |
        sort -u
}

get_active_ips() {
    local user="$1"
    local output_file="$2"
    local current_timestamp
    local line
    local access_date
    local access_time
    local ip_field
    local ip_address
    local log_timestamp
    local time_difference

    : > "$output_file"

    current_timestamp=$(date +%s)

    tail -n 500 "$ACCESS_LOG" 2>/dev/null |
        grep -F "email: ${user}" |
        grep -v "127.0.0.1" |
        while IFS= read -r line; do

            access_date=$(echo "$line" | awk '{print $1}' | tr '/' '-')
            access_time=$(echo "$line" | awk '{print $2}')
            ip_field=$(echo "$line" | awk '{print $3}')

            ip_field=${ip_field#tcp://}
            ip_field=${ip_field#udp://}
            ip_field=${ip_field#http://}
            ip_field=${ip_field#https://}
            ip_field=${ip_field#[}
            ip_field=${ip_field%]}

            if [[ "$ip_field" =~ ^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):[0-9]+$ ]]; then
                ip_address="${BASH_REMATCH[1]}"
            elif [[ "$ip_field" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
                ip_address="$ip_field"
            else
                continue
            fi

            log_timestamp=$(date -d "${access_date} ${access_time}" +%s 2>/dev/null)

            if [ -z "$log_timestamp" ]; then
                continue
            fi

            time_difference=$((current_timestamp - log_timestamp))

            if [ "$time_difference" -ge 0 ] && [ "$time_difference" -lt 10 ]; then
                printf '%s\n' "$ip_address"
            fi
        done |
        sort -u \
        > "$output_file"
}

process_protocol() {
    local protocol="$1"
    local user
    local ip_file
    local ip_limit
    local active_file
    local ip_count
    local ip_list
    local timestamp

    while IFS= read -r user; do
        [ -z "$user" ] && continue

        ip_file="/etc/xray/${protocol}/${user}IP"

        if [ ! -f "$ip_file" ]; then
            continue
        fi

        ip_limit=$(cat "$ip_file" 2>/dev/null)

        if ! [[ "$ip_limit" =~ ^[0-9]+$ ]]; then
            ip_limit=0
        fi

        if [ "$ip_limit" -eq 0 ]; then
            continue
        fi

        active_file="${ROTATION_DIR}/${protocol}_${user}.ips"

        get_active_ips "$user" "$active_file"

        if [ ! -s "$active_file" ]; then
            rm -f "$active_file"
            continue
        fi

        ip_count=$(wc -l < "$active_file")
        ip_count=${ip_count// /}

        if [ "$ip_count" -gt "$ip_limit" ]; then
            ip_list=$(paste -sd ', ' "$active_file")
            timestamp=$(date '+%Y-%m-%d %H:%M:%S')

            echo "[$timestamp] Protocol=${protocol} Username=${user} TotalIP=${ip_count} BatasIP=${ip_limit} IP=${ip_list}" >> "$LIMIT_LOG"

            send_telegram \
                "$protocol" \
                "$user" \
                "$ip_count" \
                "$ip_limit" \
                "$ip_list"
        fi

        rm -f "$active_file"

    done < <(get_protocol_users "$protocol")
}

process_user_logs() {
    if [ ! -f "$ACCESS_LOG" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] File $ACCESS_LOG tidak ditemukan." >> "$LIMIT_LOG"
        return 1
    fi

    process_protocol "vmess"
    process_protocol "vless"
    process_protocol "trojan"
    process_protocol "shadowsocks"
}

cleanup() {
    rm -rf "$ROTATION_DIR"
}

trap cleanup EXIT INT TERM

if [ ! -f "/root/.vars" ]; then
    echo "Konfigurasi Telegram belum tersedia."
    echo "File /root/.vars tidak ditemukan."
    exit 1
fi

source /root/.vars

if [ -z "${bot_token:-}" ] || [ -z "${telegram_id:-}" ]; then
    echo "Token Bot Telegram atau ID Telegram belum dikonfigurasi."
    exit 1
fi

if ! check_access; then
    echo "AKSES DITOLAK!"
    echo "IP VPS : $vps_ip"
    echo "VPS belum memiliki izin akses atau masa aktif script telah berakhir."
    echo "WhatsApp : $WHATSAPP"
    echo "Telegram : $TELEGRAM"
    exit 1
fi

while true; do
    if ! check_access; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Akses INTERFLAZZ.MY.ID berakhir. Limit IP dihentikan." >> "$LIMIT_LOG"
        exit 1
    fi

    process_user_logs

    sleep "${INTERVAL_MINUTES}m"
done