پکیج پایش ژوپینگ + ربات + سینک محصول روی سایت مقصد میکسین

تغییر اصلی این نسخه
===================
- هر واریانت ژوپینگ به‌عنوان یک محصول کاملاً مستقل در مقصد ساخته می‌شود.
- محصول مقصد دیگر آرایه واریانت داخلی ندارد (`variants` همیشه خالی است).
- نام محصول مستقل شامل مشخصات واریانت است؛ نمونه: «نام ساعت - رنگ: طلایی».
- قیمت و موجودی هر محصول از همان واریانت خوانده می‌شود.
- اگر واریانتی از مبدا حذف شود، محصول مستقل قبلی در مقصد ناموجود می‌شود.
- دیتابیس MySQL کاملاً حذف شده است.

یک فایل JSON برای تمام وضعیت
============================
تنها فایل داده پایدار ربات این است:

  data_xuping/state.json

این فایل همه موارد زیر را نگه می‌دارد:
- baseline_completed: وضعیت اجرای اولیه
- subscribers: مشترک‌های ربات
- bot_offset: آفست دریافت پیام
- sent: آخرین snapshot محصولات مبدا
- sync_map: اتصال هر URL + واریانت به شناسه محصول مستقل مقصد

نوشتن state.json اتمیک و همراه lock انجام می‌شود تا اجرای همزمان poll و checker
باعث خراب‌شدن JSON یا ازبین‌رفتن داده‌ها نشود. فایل‌های log و lock داده کاربردی
نیستند و فقط برای عیب‌یابی/جلوگیری از اجرای همزمان استفاده می‌شوند.

فایل‌های اصلی
=============
- check_xuping_mixin_sync.php : پایش و ساخت/آپدیت محصولات مستقل
- poll_xuping.php             : مدیریت /start و /stop و /status
- state_store.php             : خواندن/نوشتن امن state.json
- config.php                  : مقصد میکسین و توکن ربات (بدون تنظیم دیتابیس)
- config_xuping_mixin.php     : دسته‌ها و تنظیمات ژوپینگ

راه‌اندازی
==========
1) کل پوشه را روی هاست جایگزین نسخه قبلی کن.
2) config.php و نگاشت دسته‌ها در config_xuping_mixin.php را کنترل کن.
3) دسترسی نوشتن PHP برای پوشه data_xuping فعال باشد.
4) poll_xuping.php و check_xuping_mixin_sync.php را با PHP 8 اجرا کن.

کرون پیشنهادی
=============
* * * * * /usr/bin/php /home/USER/public_html/bot/poll_xuping.php >/dev/null 2>&1
*/10 * * * * /usr/bin/php /home/USER/public_html/bot/check_xuping_mixin_sync.php >/dev/null 2>&1

رفتار اجرای اول این نسخه
=======================
state.json از سابقه موجود ربات پر شده، ولی sync_map عمداً خالی است چون شناسه‌های
قبلی فقط در دیتابیس قرار داشتند و ساختار قبلی نیز یک محصول چندواریانته بود.
بنابراین اولین اجرای checker، محصولات مستقل جدید را می‌سازد و شناسه هرکدام را
بلافاصله در state.json ثبت می‌کند. پس از آن اجراهای بعدی همان محصولات را آپدیت
می‌کنند و محصول تکراری نمی‌سازند.

برای شروع کاملاً تازه، قبل از اجرا فقط data_xuping/state.json را حذف کن.

