# ماژول خدمات مجازی (استارز / پرمیوم / گیفت)

## چه چیزی اضافه شد؟
- دو فایل جدید: `virtual_services.php` (سمت کاربر) و `virtual_services_admin.php` (سمت پنل ادمین) — کاملا مستقل و بدون تداخل با کدهای اصلی.
- در `index.php`: دو خط require_once + یک شرط `elseif` برای مسیردهی پیام‌های مربوط به این بخش.
- در `admin.php`: یک بلوک انتهایی برای مسیردهی پنل ادمین این بخش.
- در `keyboard.php`: یک دکمه‌ی جدید «🎛 پنل خدمات مجازی» به کیبورد ادمین (نقش administrator) اضافه شد.
- دکمه‌ی «🖥 صفحه دوم» به‌صورت **خودکار** (بدون نیاز به SQL دستی) در اولین اجرای ربات پس از آپلود، به انتهای کیبورد اصلی کاربران اضافه می‌شود (تابع `vsEnsureMainButton`).
- دو جدول MySQL به‌صورت خودکار در اولین اجرا ساخته می‌شوند (نیازی به اجرای SQL دستی نیست): `virtual_orders`, `virtual_settings`.

## نحوه کار برای کاربر
کاربر → دکمه «🖥 صفحه دوم» → منوی خدمات مجازی (استارز / پرمیوم / گیفت، هرکدام با رنگ قابل تغییر) →
انتخاب محصول → وارد کردن گیرنده → تایید → کسر از **کیف پول (Balance)** همان حساب کاربری →
ثبت سفارش با وضعیت «در انتظار» → ارسال گزارش به کانال گزارش خرید (همان کانال VPN، از طریق تابع
`sendMemberOrderReportChannel`) → ارسال پیام سفارش جدید برای همه‌ی ادمین‌ها با دکمه تایید/رد.

## نحوه کار برای ادمین
پنل ادمین اصلی → دکمه «🎛 پنل خدمات مجازی» → یک پنل کاملا جدا شامل:
- 🧾 سفارش‌های در انتظار (تایید = اتمام سفارش / رد = بازگشت وجه به کیف پول کاربر)
- 💰 تنظیم قیمت‌ها (قیمت هر استارز، حداقل تعداد، قیمت پرمیوم ۳/۶/۱۲ ماهه)
- 🎁 مدیریت لیست گیفت‌ها (افزودن آیتم جدید، ویرایش قیمت، تنظیم ایموجی پریمیوم و حذف هر آیتم)
- 🎨 تنظیم رنگ دکمه‌ها (آبی/سبز/قرمز - دقیقا مثل استایل دکمه‌های اصلی ربات)
- ⚙️ فعال/غیرفعال کردن کل بخش

## آپدیت دوم (این نسخه)
سه قابلیت جدید به ماژول خدمات مجازی اضافه شد:

1. **ویرایش/حذف قیمت گیفت‌ها** — از پنل «🎁 مدیریت لیست گیفت‌ها» حالا زیر هر گیفت سه دکمه هست:
   ✏️ تغییر قیمت، 🌟 تنظیم ایموجی پریمیوم، 🗑 حذف گیفت (و در صورت داشتن ایموجی، ❌ حذف ایموجی).
2. **ایموجی پریمیوم (icon_custom_emoji_id)** — هم برای سه دکمه‌ی اصلی صفحه‌ی دوم (⭐️/💎/🎁) از
   مسیر «🌟 ایموجی پریمیوم دکمه‌ها» در پنل ادمین، و هم به‌صورت جداگانه برای هر آیتم گیفت. کافیه
   ادمین یک پیام حاوی ایموجی پریمیوم واقعی (از پنل ایموجی اختصاصی پرمیوم تلگرام) بفرسته؛ ربات با
   همون تابع استانداردی که خود سورس اصلی برای ایموجی کانال‌های عضویت اجباری استفاده می‌کنه
   (`extractCustomEmojiIdFromMessage`) آیدی ایموجی رو استخراج و ذخیره می‌کنه.
3. **صفحه‌ی قوانین با افکت تایپ تدریجی** — اولین باری که هر کاربر روی «🖥 صفحه دوم» یا هر ورودی
   دیگه‌ای از این بخش بزنه، متن قوانین به‌صورت مرحله‌ای (کلمه به کلمه، با یک مکث کوتاه بین هر
   مرحله) روی پیام ادیت می‌شه تا حس تایپ زنده رو بده، و در پایان دکمه‌ی «✅ قوانین را مطالعه
   کردم و می‌پذیرم» ظاهر می‌شه. تا وقتی کاربر این دکمه رو نزنه، به منوی خدمات مجازی دسترسی
   نداره. متن قوانین از پنل ادمین («📜 تنظیم متن قوانین») قابل ویرایش کامل هست.

نکته فنی: چون ادیت پی‌درپی پیام محدودیت نرخ (flood limit) تلگرام رو داره، تعداد مراحل تایپ به
۱۲ مرحله با فاصله‌ی ۰.۱۸ ثانیه محدود شده (در مجموع حدود ۲ ثانیه) که هم افکت تایپ حس بشه و هم
به لیمیت تلگرام نخوریم.

## آپدیت سوم — قیمت‌گذاری لحظه‌ای (Premium / Stars / Gift)
از این نسخه به بعد قیمت Premium، Stars و Gift دیگر ثابت داخل دیتابیس ذخیره
نمی‌شود و هر بار که کاربر وارد این بخش‌ها می‌شود، لحظه‌ای طبق این فرمول
محاسبه می‌گردد:

```
قیمت پایه (دلاری) × نرخ لحظه‌ای دلار × (۱ + درصد سود گروه) = قیمت نهایی (تومان)
```

- منطق کامل در فایل جدید `virtual_pricing.php` است (کاملا Modular، مستقل
  از بقیه‌ی ماژول).
- **Premium**: قیمت پایه‌ی دلاریِ هر پلن (۳/۶/۱۲ ماهه) از پنل «💵 قیمت پایه
  دلاری» قابل تنظیم است (پیش‌فرض‌ها همان اعداد مرجع Fragment: ۱۱.۹۹ /
  ۱۵.۹۹ / ۲۸.۹۹ دلار).
- **Stars**: هر Star پایه ۰.۰۱۵ دلار در نظر گرفته شده (طبق همان نسبت
  موجود در سورس price.py) و قیمت هر تعداد دلخواه از همین عدد ضرب می‌شود.
- **Gift**: هر گیفت فقط یک عدد «تعداد Star» دارد (مثلا خرس تدی = ۱۵
  استارز)؛ قیمتش خودکار از (تعداد استارز × قیمت لحظه‌ای هر استارز) به‌دست
  می‌آید. گیفت جدید هم اگر اضافه شود فقط با وارد کردن تعداد استارزش قیمت‌گذاری
  می‌شود، بدون فرمول جدید.
- **درصد سود**: از پنل «📈 سود و نرخ دلار»، سه عدد جدا برای Premium/Stars/Gift
  تنظیم می‌شود؛ تغییر هرکدام بلافاصله روی همه‌ی محصولات همان گروه اعمال
  می‌شود.
- **نرخ دلار**: پیش‌فرض از یک «نرخ دستی» که در همان پنل ثبت می‌کنید خوانده
  می‌شود (دقیقا مثل خیلی از ربات‌های ایرانی که نرخ دلار روزانه دستی
  آپدیت می‌شود). اگر بخواهید کاملا خودکار باشد، می‌توانید آدرس یک API نرخ
  دلار متعلق به خودتان را هم در همان پنل وارد کنید؛ نتیجه چند دقیقه کش
  می‌شود.
- ⚠️ سورس Python (`price.py`) که برای استخراج منطق داده شده بود، یک کلید
  API خصوصیِ سرویس دیگری (swapwallet.app) را هاردکد کرده بود. آن کلید در
  این پیاده‌سازی استفاده نشده، چون استفاده از کلید API خصوصی شخص دیگری
  بدون اجازه‌اش کار درستی نیست؛ به‌جایش نرخ دلار به‌صورت ماژولار و با منبع
  متعلق به خود شما تامین می‌شود.
- دیتابیس فعلی نیازی به Migration ندارد؛ همه‌ی تنظیمات جدید در همان جدول
  `virtual_settings` (که از قبل key/value بود) ذخیره می‌شوند.

## نکات مهم قبل از آپلود روی سرور اصلی
1. **حتما ابتدا روی یک نسخه‌ی تست/staging از ربات امتحان کنید**، نه مستقیم روی ربات لایو.
2. پرداخت این بخش از طریق «کیف‌پول داخلی (Balance)» انجام می‌شود — همان کیف پولی که در ربات
   اصلی برای تمدید/خرید VPN استفاده می‌شود. اگر کاربر موجودی کافی نداشته باشد پیام مناسب دریافت می‌کند.
3. تحویل نهایی استارز/پرمیوم/گیفت به‌صورت **دستی توسط ادمین** انجام می‌شود (دقیقا مانند منطق
   ADMIN_CHAT_ID در سورس پایتون gift.py) چون خرید واقعی استارز/پرمیوم تلگرام نیازمند API
   Fragment یا حساب واسط است که در سورس پایتون ارائه‌شده هم به‌صورت خودکار انجام نمی‌شد.
4. قیمت‌های پیش‌فرض فقط نمونه هستند؛ حتما از پنل «💰 تنظیم قیمت‌ها» آن‌ها را با نرخ روز خودتان
   جایگزین کنید.
