╔══════════════════════════════════════════════════════════════════╗
║          📚 مستندات فنی ربات فروشگاه APN VPN                     ║
║                    راهنمای توسعه‌دهندگان                         ║
╚══════════════════════════════════════════════════════════════════╝

═══════════════════════════════════════════════════════════════════

📁 ساختار فایل‌ها و پوشه‌ها
───────────────────────────────────────────────────────────────

robot ali/
│
├── baseInfo.php          # اطلاعات پایه (توکن، دیتابیس، ادمین)
├── bot.php               # فایل اصلی ربات (منطق اصلی)
├── config.php            # تنظیمات و توابع کمکی
├── createDB.php          # ایجاد جداول دیتابیس
├── search.php            # جستجوی کانفیگ‌ها
├── index.html            # صفحه اصلی وب
│
├── assets/               # فایل‌های CSS و استایل
│   ├── style.css
│   ├── webconf.css
│   └── 20bb620751bbea45.css
│
├── pay/                  # سیستم پرداخت
│   ├── index.php         # صفحه پرداخت اصلی
│   └── back.php          # بازگشت از درگاه
│
├── phpqrcode/            # کتابخانه QR Code
│   ├── qrlib.php
│   └── ...
│
├── settings/             # تنظیمات و ماژول‌ها
│   ├── values.php        # متن‌های ربات
│   ├── jdf.php           # تاریخ شمسی
│   ├── subLink.php       # لینک سابسکریپشن
│   ├── temp.txt          # ذخیره موقت
│   └── ...
│
└── webapp/               # برنامه‌های وب
    ├── speedtest.html
    └── listgheymat.html

═══════════════════════════════════════════════════════════════════

🗄️ ساختار دیتابیس
───────────────────────────────────────────────────────────────

1️⃣ جدول users - اطلاعات کاربران
─────────────────────────────────────

CREATE TABLE `users` (
  `id` int(11) PRIMARY KEY AUTO_INCREMENT,
  `userid` varchar(40) NOT NULL,           -- آیدی تلگرام
  `name` varchar(100) NOT NULL,            -- نام کاربر
  `username` varchar(100) NOT NULL,        -- یوزرنیم
  `refcode` varchar(50) NOT NULL,          -- کد معرف
  `wallet` int(11) DEFAULT 0,              -- موجودی کیف پول
  `date` varchar(50) NOT NULL,             -- تاریخ ثبت‌نام
  `phone` varchar(15),                     -- شماره تلفن
  `refered_by` bigint(10),                 -- معرف
  `step` varchar(1000) DEFAULT 'none',     -- مرحله فعلی کاربر
  `freetrial` varchar(10),                 -- آزمایشی
  `isAdmin` tinyint(1) DEFAULT 0,          -- آیا ادمین است؟
  `first_start` varchar(10),               -- اولین استارت
  `temp` text,                             -- داده موقت
  `is_agent` int(1) DEFAULT 0,             -- آیا نماینده است؟
  `discount_percent` int(255) DEFAULT 0,   -- درصد تخفیف نماینده
  `agent_date` int(255) DEFAULT 0          -- تاریخ نمایندگی
);

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

2️⃣ جدول server_plans - پلن‌های VPN
─────────────────────────────────────

CREATE TABLE `server_plans` (
  `id` int(11) PRIMARY KEY AUTO_INCREMENT,
  `fileid` varchar(250) NOT NULL,
  `catid` int(11) NOT NULL,                -- آیدی دسته‌بندی
  `server_id` int(11) NOT NULL,            -- آیدی سرور
  `inbound_id` int(11) DEFAULT 0,
  `acount` bigint(20) NOT NULL,            -- ظرفیت
  `limitip` int(11) DEFAULT 1,             -- محدودیت IP
  `title` varchar(150) NOT NULL,           -- نام پلن
  `protocol` varchar(100) NOT NULL,        -- vless/vmess/trojan
  `days` float NOT NULL,                   -- مدت زمان (روز)
  `volume` float NOT NULL,                 -- حجم (گیگ)
  `type` varchar(50) NOT NULL,             -- نوع (tcp/ws/grpc)
  `price` int(11) NOT NULL,                -- قیمت (تومان)
  `descr` text NOT NULL,                   -- توضیحات
  `pic` varchar(100) NOT NULL,
  `active` int(11) DEFAULT 0,              -- فعال/غیرفعال
  `step` int(11) NOT NULL,
  `date` varchar(50) NOT NULL,
  `rahgozar` int(10) DEFAULT 0,            -- رهگذر
  `dest` varchar(1000),                    -- dest (برای reality)
  `serverNames` TEXT,                      -- serverNames
  `spiderX` varchar(500),                  -- spiderX
  `flow` varchar(50) DEFAULT 'None',
  `custom_path` int(10) DEFAULT 1,
  `custom_port` int(255) DEFAULT 0,
  `custom_sni` varchar(500)
);

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

3️⃣ جدول orders_list - سفارشات
─────────────────────────────────────

CREATE TABLE `orders_list` (
  `id` int(11) PRIMARY KEY AUTO_INCREMENT,
  `userid` varchar(30) NOT NULL,           -- آیدی کاربر
  `token` varchar(100) NOT NULL,           -- توکن یکتا
  `transid` varchar(150) NOT NULL,         -- شناسه تراکنش
  `fileid` int(11) NOT NULL,               -- آیدی پلن
  `server_id` int(11) NOT NULL,            -- آیدی سرور
  `inbound_id` int(11) DEFAULT 0,
  `remark` varchar(100) NOT NULL,          -- نام کانفیگ
  `protocol` varchar(20) NOT NULL,         -- پروتکل
  `expire_date` int(11) NOT NULL,          -- تاریخ انقضا
  `link` text NOT NULL,                    -- لینک کانفیگ (JSON)
  `amount` int(11) NOT NULL,               -- مبلغ پرداختی
  `status` int(11) NOT NULL,               -- وضعیت
  `date` varchar(50) NOT NULL,             -- تاریخ خرید
  `notif` int(11) DEFAULT 0,               -- اعلان
  `rahgozar` int(10) DEFAULT 0,
  `agent_bought` int(1) DEFAULT 0          -- خرید نماینده
);

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

4️⃣ جدول pays - پرداخت‌ها
─────────────────────────────────────

CREATE TABLE `pays` (
  `id` int(255) PRIMARY KEY AUTO_INCREMENT,
  `hash_id` varchar(1000) NOT NULL,        -- شناسه یکتا
  `description` varchar(5000),             -- توضیحات
  `payid` varchar(500),                    -- آیدی درگاه
  `user_id` bigint(10) NOT NULL,           -- آیدی کاربر
  `type` varchar(100),                     -- نوع پرداخت
  `plan_id` int(255),                      -- آیدی پلن
  `volume` int(255),                       -- حجم
  `day` int(255),                          -- روز
  `price` int(255) NOT NULL,               -- مبلغ
  `request_date` int(255) NOT NULL,        -- تاریخ درخواست
  `state` varchar(255) NOT NULL,           -- وضعیت (pending/approved)
  `agent_bought` int(1) DEFAULT 0,
  `agent_count` int(255) DEFAULT 0
);

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

5️⃣ جدول server_info - اطلاعات سرورها
─────────────────────────────────────

CREATE TABLE `server_info` (
  `id` int(11) PRIMARY KEY AUTO_INCREMENT,
  `title` varchar(200) NOT NULL,           -- نام سرور
  `ucount` varchar(20) NOT NULL,           -- ظرفیت
  `remark` varchar(100) NOT NULL,          -- ریمارک پیش‌فرض
  `flag` varchar(100) NOT NULL,            -- پرچم (🇩🇪)
  `active` int(11) DEFAULT 0,              -- فعال/غیرفعال
  `state` int(255) DEFAULT 1               -- وضعیت
);

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

6️⃣ جدول server_config - تنظیمات سرور
─────────────────────────────────────

CREATE TABLE `server_config` (
  `id` int(11) PRIMARY KEY AUTO_INCREMENT,
  `panel_url` varchar(254) NOT NULL,       -- آدرس پنل
  `ip` text NOT NULL,                      -- آیپی سرور
  `sni` varchar(254) NOT NULL,             -- SNI
  `header_type` enum('none','http'),
  `request_header` text NOT NULL,
  `response_header` text NOT NULL,
  `security` enum('xtls','tls','none'),
  `tlsSettings` text NOT NULL,
  `type` varchar(100),                     -- sanaei/alireza/normal
  `username` varchar(100) NOT NULL,        -- یوزر پنل
  `password` varchar(100) NOT NULL,        -- پسورد پنل
  `port_type` varchar(10) DEFAULT 'auto',  -- نوع پورت
  `reality` varchar(10) DEFAULT 'false'    -- reality فعال؟
);

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

7️⃣ جدول setting - تنظیمات ربات
─────────────────────────────────────

CREATE TABLE `setting` (
  `id` int(255) PRIMARY KEY AUTO_INCREMENT,
  `type` varchar(500) NOT NULL,            -- نوع تنظیم
  `value` text NOT NULL                    -- مقدار (JSON)
);

انواع تنظیمات:
  - BOT_STATES: وضعیت‌های ربات
  - PAYMENT_KEYS: کلیدهای درگاه
  - INVITE_BANNER_TEXT: بنر دعوت
  - INVITE_BANNER_AMOUNT: مبلغ پورسانت
  - TICKETS_CATEGORY: دسته‌بندی تیکت

═══════════════════════════════════════════════════════════════════

🔧 توابع مهم در config.php
───────────────────────────────────────────────────────────────

1️⃣ ارسال پیام
─────────────────

sendMessage($text, $keyboard = null, $parse = "MarkDown", 
            $chat_id = null, $reply_to = null)

پارامترها:
  - $text: متن پیام
  - $keyboard: کیبورد (JSON)
  - $parse: نوع پارس (MarkDown/HTML)
  - $chat_id: آیدی چت (پیش‌فرض: کاربر فعلی)
  - $reply_to: ریپلای به پیام

مثال:
  sendMessage("سلام", null, "HTML", 123456789);

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

2️⃣ ارسال عکس
─────────────────

sendPhoto($photo, $caption = null, $keyboard = null, 
          $parse = "MarkDown", $chat_id = null)

پارامترها:
  - $photo: آیدی فایل یا URL
  - $caption: کپشن
  - $keyboard: کیبورد
  - $parse: نوع پارس
  - $chat_id: آیدی چت

مثال:
  sendPhoto("photo.jpg", "توضیحات", null, "HTML");

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

3️⃣ ویرایش پیام
─────────────────

editText($message_id, $text, $keyboard = null, 
         $parse = null, $chat_id = null)

پارامترها:
  - $message_id: آیدی پیام
  - $text: متن جدید
  - $keyboard: کیبورد جدید
  - $parse: نوع پارس
  - $chat_id: آیدی چت

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

4️⃣ حذف پیام
─────────────────

delMessage($message_id = null, $chat_id = null)

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

5️⃣ نمایش Alert
─────────────────

alert($text, $show_alert = false, $callback_id = null)

پارامترها:
  - $text: متن الرت
  - $show_alert: نمایش به صورت پاپ‌آپ؟
  - $callback_id: آیدی کالبک

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

6️⃣ ست کردن مرحله کاربر
─────────────────

setUser($value = 'none', $field = 'step')

پارامترها:
  - $value: مقدار جدید
  - $field: فیلد (step, temp, wallet, ...)

مثال:
  setUser("waitingForAmount");  // ست کردن step
  setUser(5000, "wallet");      // افزودن به کیف پول

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

7️⃣ ساخت کیبورد اصلی
─────────────────

getMainKeys()

برمی‌گرداند: JSON کیبورد اصلی بر اساس دسترسی کاربر

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

8️⃣ ساخت کیبورد ادمین
─────────────────

getAdminKeys()

برمی‌گرداند: JSON کیبورد پنل مدیریت

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

9️⃣ تولید رشته تصادفی
─────────────────

RandomString($count = 9, $type = "all")

پارامترها:
  - $count: تعداد کاراکتر
  - $type: all/small/domain

مثال:
  $token = RandomString(30);

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

🔟 تولید UUID
─────────────────

generateUID()

برمی‌گرداند: یک UUID استاندارد (v4)

مثال:
  $uuid = generateUID();
  // نتیجه: 550e8400-e29b-41d4-a716-446655440000

═══════════════════════════════════════════════════════════════════

📊 فلوچارت فرآیند خرید
───────────────────────────────────────────────────────────────

START
  ↓
[کاربر /start می‌زند]
  ↓
[منوی اصلی نمایش داده می‌شود]
  ↓
[خرید سرویس 🛍]
  ↓
[انتخاب سرور]
  ↓
[انتخاب دسته‌بندی]
  ↓
[انتخاب پلن]
  ↓
[نمایش فاکتور]
  ↓
[انتخاب روش پرداخت]
  ↓
┌─────────────────┬─────────────────┐
│  کارت به کارت  │  کیف پول       │
└─────────────────┴─────────────────┘
  ↓                     ↓
[آپلود رسید]      [کسر از موجودی]
  ↓                     ↓
[ارسال به ادمین]       ↓
  ↓                     ↓
[تأیید/رد ادمین]       ↓
  ↓                     ↓
  └──────────┬──────────┘
             ↓
     [ساخت کانفیگ]
             ↓
     [ارسال به کاربر]
             ↓
           END

═══════════════════════════════════════════════════════════════════

🔐 سیستم امنیتی
───────────────────────────────────────────────────────────────

1️⃣ بررسی IP تلگرام
─────────────────

تابع check() در config.php:
  - تمام درخواست‌ها را از نظر IP بررسی می‌کند
  - فقط IP های رسمی تلگرام قبول می‌شوند
  - از حملات خارجی جلوگیری می‌کند

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

2️⃣ بررسی دسترسی ادمین
─────────────────

if ($from_id == $admin || $userInfo['isAdmin'] == true) {
    // کد ادمین
}

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

3️⃣ ذخیره امن اطلاعات
─────────────────

  - تمام داده‌ها با prepared statements ذخیره می‌شوند
  - از SQL Injection جلوگیری می‌شود
  - پسورد دیتابیس پیچیده

مثال:
  $stmt = $connection->prepare("SELECT * FROM users WHERE userid=?");
  $stmt->bind_param("i", $user_id);
  $stmt->execute();

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

4️⃣ توکن یکتا برای هر سفارش
─────────────────

هر سفارش یک توکن 30 کاراکتری دارد:
  $token = RandomString(30);

برای جلوگیری از دسترسی غیرمجاز به لینک‌های اشتراک

═══════════════════════════════════════════════════════════════════

🎨 شخصی‌سازی متن‌ها
───────────────────────────────────────────────────────────────

فایل: settings/values.php

همه متن‌ها در آرایه‌های زیر قرار دارند:

$mainValues = [
    'start_message' => 'سلام {NAME}...',
    'buy_sub_select_location' => 'لوکیشن را انتخاب کنید',
    // ...
];

$buttonValues = [
    'buy_subscriptions' => 'خرید سرویس 🛍',
    'my_subscriptions' => 'سرویس‌های من 📋',
    // ...
];

برای تغییر متن‌ها، این فایل را ویرایش کنید.

═══════════════════════════════════════════════════════════════════

🌐 API های خارجی
───────────────────────────────────────────────────────────────

1️⃣ Telegram Bot API
─────────────────

Base URL: https://api.telegram.org/bot{TOKEN}/

متدهای استفاده شده:
  - sendMessage
  - editMessageText
  - deleteMessage
  - sendPhoto
  - answerCallbackQuery
  - getChat
  - getChatMember
  - setWebhook
  - getWebhookInfo

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

2️⃣ NOW Payments API (درگاه ارزی)
─────────────────

Base URL: https://api.nowpayments.io/v1/

متدهای استفاده شده:
  - POST /payment: ایجاد پرداخت
  - GET /payment/{id}: بررسی وضعیت

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

3️⃣ Panel APIs (مدیریت VPN)
─────────────────

سه نوع پنل پشتیبانی می‌شود:
  - Sanaei Panel
  - Alireza Panel
  - Normal Panel

توابع مهم:
  - addUser(): افزودن کاربر جدید
  - editInboundTraffic(): ویرایش ترافیک
  - deleteClient(): حذف کاربر
  - getJson(): دریافت اطلاعات

═══════════════════════════════════════════════════════════════════

📝 نمونه کد
───────────────────────────────────────────────────────────────

1️⃣ افزودن پلن جدید
─────────────────

$stmt = $connection->prepare("INSERT INTO `server_plans` 
    (`title`, `catid`, `server_id`, `protocol`, `days`, `volume`, `price`, `active`) 
    VALUES (?, ?, ?, ?, ?, ?, ?, 1)");

$title = "پلن 30 گیگ یک ماهه";
$catid = 1;
$server_id = 1;
$protocol = "vless";
$days = 30;
$volume = 30;
$price = 50000;

$stmt->bind_param("siiisdi", $title, $catid, $server_id, 
                  $protocol, $days, $volume, $price);
$stmt->execute();
$stmt->close();

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

2️⃣ دریافت لیست سفارشات کاربر
─────────────────

$stmt = $connection->prepare("SELECT * FROM `orders_list` 
                               WHERE `userid` = ? AND `status` = 1 
                               ORDER BY `date` DESC");
$stmt->bind_param("i", $from_id);
$stmt->execute();
$orders = $stmt->get_result();
$stmt->close();

while($order = $orders->fetch_assoc()) {
    echo "نام: " . $order['remark'] . "\n";
    echo "قیمت: " . $order['amount'] . " تومان\n";
}

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

3️⃣ ارسال پیام با کیبورد
─────────────────

$keyboard = json_encode([
    'inline_keyboard' => [
        [
            ['text' => 'تأیید ✅', 'callback_data' => 'approve'],
            ['text' => 'رد ❌', 'callback_data' => 'reject']
        ],
        [
            ['text' => 'بازگشت 🔙', 'callback_data' => 'back']
        ]
    ]
]);

sendMessage("لطفاً یکی از گزینه‌ها را انتخاب کنید:", $keyboard);

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

4️⃣ بررسی callback
─────────────────

if($data == "approve") {
    alert("تأیید شد ✅");
    editText($message_id, "سفارش تأیید شد");
}

elseif(preg_match('/^deleteOrder(\d+)/', $data, $match)) {
    $order_id = $match[1];
    // حذف سفارش
}

═══════════════════════════════════════════════════════════════════

🔄 Cron Jobs پیشنهادی
───────────────────────────────────────────────────────────────

1️⃣ اعلان انقضای سرویس
─────────────────

زمان: هر روز ساعت 10 صبح
فایل: settings/messagewizwiz.php

دستور cron:
0 10 * * * php /path/to/settings/messagewizwiz.php

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

2️⃣ گزارش درآمد روزانه
─────────────────

زمان: هر n ساعت (تنظیم در پنل)
فایل: settings/rewardReport.php

دستور cron:
0 */3 * * * php /path/to/settings/rewardReport.php

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

3️⃣ بکاپ خودکار دیتابیس
─────────────────

زمان: هر روز ساعت 2 بامداد

دستور cron:
0 2 * * * mysqldump -u lotfisch_qq -p'sD[hW&bth(CY])3r' lotfisch_qq > backup_$(date +\%Y\%m\%d).sql

═══════════════════════════════════════════════════════════════════

🐛 Debug و لاگ‌گیری
───────────────────────────────────────────────────────────────

1️⃣ فعال کردن خطاها (فقط در مرحله توسعه)
─────────────────

در baseInfo.php:
  error_reporting(E_ALL);
  ini_set('display_errors', 1);

⚠️ توجه: در محیط production غیرفعال کنید!

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

2️⃣ ذخیره لاگ
─────────────────

file_put_contents('debug.log', print_r($update, true), FILE_APPEND);

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

3️⃣ بررسی webhook
─────────────────

https://api.telegram.org/bot{TOKEN}/getWebhookInfo

پارامترهای مهم:
  - url: آدرس webhook
  - has_custom_certificate: false
  - pending_update_count: 0 (باید صفر باشد)
  - last_error_message: بررسی خطا

═══════════════════════════════════════════════════════════════════

📞 پشتیبانی فنی
───────────────────────────────────────────────────────────────

برای سوالات فنی:

1. فایل error_log را بررسی کنید
2. Webhook را چک کنید
3. لاگ دیتابیس را بررسی کنید
4. از مستندات بالا استفاده کنید

آیدی ادمین: 8110165534
وبسایت: https://lotfisch.ir

═══════════════════════════════════════════════════════════════════

نسخه: 1.0.0
آخرین بروزرسانی: نوامبر 2025
توسعه‌دهنده: فروشگاه APN

═══════════════════════════════════════════════════════════════════