<?php
/**
 * Auto-extracted module from the old large bot.php.
 * Loaded by bot.php in the original execution order.
 */
//##############دریافت اپدیت های ربات#####################################
$update = json_decode(file_get_contents('php://input'));
if(!is_object($update)){ http_response_code(200); exit; }
// آپدیت خروج از کانال/گروه را قبل از منطق پیام‌های معمولی هندل می‌کنیم.
// این مسیر فقط همان کاربر خارج‌شده را بررسی می‌کند و اسکن سنگین روی همه کاربران نمی‌زند.
if(function_exists('bale_handle_left_chat_member_update') && bale_handle_left_chat_member_update($update)){
    http_response_code(200);
    exit;
}
// اگر ربات از کانال/گروه آپدیت بگیرد، فقط شناسه را داخلی ذخیره می‌کنیم.
// نباید برای ادمین‌ها پیام اضافی ارسال شود؛ کانال‌ها فقط محل پست تبلیغ/سفارش هستند.
if(isset($update->channel_post) && isset($update->channel_post->chat)){
    bale_chat_object_to_ref($update->channel_post->chat);
    http_response_code(200);
    exit;
}
//################متغیر های کاربران################################
// آپدیت‌ها همیشه پیام معمولی نیستند؛ بعضی وقت‌ها فقط callback یا inline می‌آید.
// مقداردهی امن باعث می‌شود هاست پر از warning نشود و هندلرهای قدیمی مسیر اشتباه نروند.
$message = (isset($update->message) && is_object($update->message)) ? $update->message : null;
$callback_query = (isset($update->callback_query) && is_object($update->callback_query)) ? $update->callback_query : null;
$inline_query = (isset($update->inline_query) && is_object($update->inline_query)) ? $update->inline_query : null;
$msg = ($message && isset($message->text)) ? (string)$message->text : '';
$data = ($callback_query && isset($callback_query->data)) ? (string)$callback_query->data : '';
$shareing = ($inline_query && isset($inline_query->query)) ? (string)$inline_query->query : '';
$chatID = $msg_id = $userID = $first_name = $username = $Tc = $data_id = null;
$inline_keyboard = null;
if($message){
    $chatID = $message->chat->id ?? null;
    $msg_id = $message->message_id ?? null;
    $userID = $message->from->id ?? null;
    $first_name = $message->from->first_name ?? '';
    $username = $message->from->username ?? '';
    $Tc = $message->chat->type ?? null;
}
if($callback_query){
    $data_id = $callback_query->id ?? null;
    $chatID = $callback_query->message->chat->id ?? null;
    $inline_keyboard = $callback_query->message->reply_markup->inline_keyboard ?? null;
    $userID = $callback_query->from->id ?? null;
    $first_name = $callback_query->from->first_name ?? '';
    $username = $callback_query->from->username ?? '';
    $Tc = $callback_query->message->chat->type ?? null;
    $msg_id = $callback_query->message->message_id ?? null;
    // در آپدیت‌های شیشه‌ای متن پیام کاربر نداریم؛ مقدار امن می‌گذاریم تا دکمه‌های خالی قدیمی با null برابر نشوند.
    $msg = '__callback_query_no_text__';
}
if($inline_query){
    $userID = $inline_query->from->id ?? $userID;
    $chatID = $userID ?: $chatID;
    $first_name = $inline_query->from->first_name ?? $first_name;
    $username = $inline_query->from->username ?? $username;
    $Tc = 'private';
}
if(isset($Tc) && $Tc !== null && $Tc !== 'private'){
    $GLOBALS['BOT_INBOUND_NON_PRIVATE_CHAT_ID'] = (string)($chatID ?? '');
    $GLOBALS['BOT_INBOUND_NON_PRIVATE_CHAT_TYPE'] = (string)$Tc;
}
if(empty($userID)){ http_response_code(200); exit; }

// دکمه‌های شیشه‌ای خنثی داخل کانال/پیوی باید فوری جواب بگیرند و وارد مسیرهای قدیمی نشوند.
if(isset($data) && in_array((string)$data, ['0','noop','shop-noop','order-noop'], true)){
    if(isset($data_id)) bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'', 'show_alert'=>false]);
    exit;
}

// ربات داخل کانال/گروه نباید پیام مدیریتی، راهنما یا خطا بفرستد.
// فقط callbackهای مجاز پست تبلیغاتی کانال مثل دریافت الماس و گزارش تخلف پردازش می‌شوند.
// بقیه پیام‌ها/دکمه‌ها باید داخل پیوی ربات انجام شوند تا کانال با پیام‌های خطا پر نشود.
if(isset($Tc) && $Tc !== 'private'){
    $safeChannelCallback = ($callback_query && (preg_match('/^(getcoin|goz)-[A-Za-z0-9_\-]+$/', (string)$data) || preg_match('/^manualpay_(approve|reject)_\d+$/', (string)$data) || in_array((string)$data, ['0','noop','shop-noop','order-noop'], true)));
    if(!$safeChannelCallback){
        if($callback_query && !empty($data_id)){
            bot('answercallbackquery', [
                'callback_query_id'=>$data_id,
                'text'=>'این دکمه فقط داخل پیوی ربات قابل استفاده است. ربات داخل کانال پیام مدیریتی نمی‌فرستد.',
                'show_alert'=>true
            ]);
        }
        http_response_code(200);
        exit;
    }
}
//##################دیتای کاربران###############################
$user = [];
if(!empty($userID)){
    $user = bot_data_get_json("melat/$userID.json", []);
    if(!is_array($user)) $user = [];
}
$userDefaults = [
    'step'=>'none','zirmjmae'=>'0','Points'=>'0','time-day'=>'0','days'=>'0','ads'=>'0',
    'enteghal_as'=>0,'enteghal_to'=>0,'type-panel'=>'عادی','date-start'=>'','sefaresh'=>'0',
    'warn'=>'0','send-coin-admin'=>'0','zirmjmae-porsant'=>'0','zirmjmae-join'=>'0'
];
$user = array_merge($userDefaults, $user);
if((int)($user["Points"] ?? 0) < 0){
    $user["Points"] = "0";
    saveJson("melat/$userID.json",$user);
}
$step = $user["step"];
$inv = $user["zirmjmae"];
$Points = $user["Points"];
$timer = $user["time-day"];
$dayaes = $user['days'];
$adss = $user['ads'];
$recivecoins = $user["enteghal_as"];
$sentcoins = $user["enteghal_to"];
$panels = $user['type-panel'];
$dates = $user['date-start'];
$sefaresh = $user["sefaresh"];
$warn = $user["warn"];
$coin_admin = $user["send-coin-admin"];
$invcoin = $user["zirmjmae-porsant"];
$invjoin = $user["zirmjmae-join"];
//=====================================================
if(is_file("lib/kodam/list.json")){
$list = bot_data_get_json("lib/kodam/list.json");
if(!is_array($list)) $list = [];
$masterAdminIds = function_exists('bot_config_master_admin_ids') ? bot_config_master_admin_ids() : [(string)$admin];
if(!isset($list['admins']) || !is_array($list['admins'])) $list['admins'] = $masterAdminIds;
if(!isset($list['ban']) || !is_array($list['ban'])) $list['ban'] = [];
$ban = $list['ban'];
}
//=====================================================
// Admins must never be blocked by forced-join / bot-off checks.
// Cast IDs to string because Telegram/Telegram-like APIs may return numeric IDs as int or string.
$adminIds = function_exists('bot_runtime_admin_list') ? bot_runtime_admin_list() : array_map('strval', isset($list['admins']) && is_array($list['admins']) ? $list['admins'] : []);
$syncIds = function_exists('bot_unique_numeric_ids') ? bot_unique_numeric_ids(array_merge((array)($list['admins'] ?? []), $adminIds)) : array_values(array_unique($adminIds));
if($syncIds !== ($list['admins'] ?? [])){
    $list['admins'] = $syncIds;
    bot_data_put_json("lib/kodam/list.json", $list);
}
$isAdmin = (isset($userID) && (function_exists('bot_is_bot_admin') ? bot_is_bot_admin($userID) : in_array((string)$userID, $adminIds, true))) || (isset($chatID) && (function_exists('bot_is_bot_admin') ? bot_is_bot_admin($chatID) : in_array((string)$chatID, $adminIds, true)));

// دکمه‌های تأیید/رد رسید داخل کانال رسیدها هم باید کار کنند.
// این مسیر فقط callback شیشه‌ای را جواب می‌دهد و هیچ پیام مدیریتی داخل کانال ارسال نمی‌کند.
if($callback_query && isset($Tc) && $Tc !== 'private' && preg_match('/^manualpay_(approve|reject)_(\d+)$/', (string)$data, $receiptActionMatch)){
    if(!$isAdmin){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'فقط ادمین‌های ربات اجازه بررسی رسید را دارند.', 'show_alert'=>true]);
        http_response_code(200);
        exit;
    }
    if(function_exists('bot_manual_receipt_handle_admin_action')){
        bot_manual_receipt_handle_admin_action($data_id, $chatID, $msg_id, $userID, $receiptActionMatch[1], $receiptActionMatch[2]);
    }else{
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'هندلر رسید فعال نیست.', 'show_alert'=>true]);
    }
    http_response_code(200);
    exit;
}
if(function_exists('bot_admin_tools_maintenance_guard') && bot_admin_tools_maintenance_guard()){ exit; }
if(isset($chatID) && is_array($ban) && in_array($chatID,$ban) && !$isAdmin){
exit();
}
//////////------------------------\\\\\\\\\\\\\\/
if(file_exists("block")){
SM($chatID,"این ربات توسط کارگروه تعیین مصادیق بلاک شده است",'html');
exit();   
}
//=====================================================
//##############متغیر های اضافی#################################
$time = jdate("H:i:s");
$date = jdate("Y/m/d");
$channel = trim(bot_data_get_text("lib/kodam/channel.txt"));
$channel2 = trim(bot_data_get_text("lib/kodam/channel2.txt"));
$chads = trim(bot_data_get_text("lib/kodam/cht.txt"));
$giftch = trim(bot_data_get_text("lib/kodam/giftch.txt"));

// قفل عضویت اجباری چندکاناله.
// نسخه‌های قدیمی فقط channel.txt و channel2.txt داشتند؛ این تابع همان‌ها را هم برای سازگاری می‌خواند.
$stats = 'member';
$stats2 = 'member';
// چک عضویت اجباری باید همیشه تازه باشد.
// قبلاً بعد از یک بار زدن «بررسی عضویت»، وضعیت member داخل کش می‌ماند و اگر کاربر بعداً لفت می‌داد،
// تا مدت زیادی یا در بعضی نصب‌ها اصلاً دوباره قفل نمی‌شد. برای ممبرگیر این رفتار امن نیست.
$forceJoinFreshCheck = (defined('BOT_FORCED_JOIN_ALWAYS_FRESH') ? (bool)BOT_FORCED_JOIN_ALWAYS_FRESH : true);
if(isset($data) && (string)$data === 'forced_join_check') $forceJoinFreshCheck = true;
$forcedJoinChannels = function_exists('bale_forced_join_channels_active') ? bale_forced_join_channels_active() : array_values(array_filter([$channel, $channel2]));
$forcedJoinMissingChannels = [];
if(!$isAdmin && isset($Tc) && $Tc == 'private'){
    $seenForced = [];
    foreach($forcedJoinChannels as $forcedChannelRef){
        $forcedChannelRef = trim((string)$forcedChannelRef);
        if($forcedChannelRef === '') continue;
        $forcedKey = function_exists('bale_forced_join_channel_key') ? bale_forced_join_channel_key($forcedChannelRef) : strtolower($forcedChannelRef);
        if($forcedKey !== '' && isset($seenForced[$forcedKey])) continue;
        if($forcedKey !== '') $seenForced[$forcedKey] = true;
        $status = function_exists('bale_get_channel_member_status_cached')
            ? bale_get_channel_member_status_cached($forcedChannelRef, $userID, null, $forceJoinFreshCheck)
            : bale_get_channel_member_status($forcedChannelRef, $userID);
        // اگر تلگرام به خاطر مشکل کانال/ادمین نبودن ربات وضعیت را نداد، کاربر را قفل نکن.
        // این حالت قبلاً باعث می‌شد کل ربات روی کانال خراب/غلط گیر کند و همه دکمه‌ها بی‌جواب شوند.
        if($status === null) continue;
        if(!bale_is_member_status($status)) $forcedJoinMissingChannels[] = $forcedChannelRef;
    }
}
if(!$isAdmin && isset($Tc) && $Tc == 'private' && !empty($forcedJoinMissingChannels) && function_exists('bot_fraud_guard_forced_join_leave')){
    bot_fraud_guard_forced_join_leave($userID, $forcedJoinMissingChannels);
}

// قفل جوین اجباری باید از همان ابتدای /start و قبل از هر منوی کاربری فعال شود.
// اگر کاربر هنوز عضو همه چنل‌های قفل‌شده نیست، هیچ منوی اصلی/هدیه/رفرالی دریافت نمی‌کند.
if(!$isAdmin && isset($Tc) && $Tc == 'private' && !empty($forcedJoinMissingChannels)){
    // اگر کاربر با لینک زیرمجموعه آمده، قبل از خروج بابت جوین اجباری، معرف را ذخیره کن.
    // وگرنه فایل کاربر با sub=null ساخته می‌شود و بعد از عضویت دیگر زیرمجموعه حساب نمی‌شود.
    if(isset($msg) && preg_match('/^\/start(?:\s+(.+))?$/', trim((string)$msg), $startMatch) && !bot_data_file_exists("melat/$userID.json")){
        $payload = isset($startMatch[1]) ? trim((string)$startMatch[1]) : '';
        $registeredByRef = false;
        if($payload !== '' && function_exists('bot_referral_register_start_payload')){
            $reg = bot_referral_register_start_payload($userID, $payload, $user, true);
            $registeredByRef = is_array($reg) && !empty($reg['ok']);
            $loadedUser = function_exists('bot_data_get_json') ? bot_data_get_json("melat/$userID.json", []) : [];
            if(is_array($loadedUser) && !empty($loadedUser)) $user = array_merge($user, $loadedUser);
        }
        if(!$registeredByRef && !bot_data_file_exists("melat/$userID.json")){
            $newUser = function_exists('bot_referral_create_default_user') ? bot_referral_create_default_user($userID, null) : $user;
            if(function_exists('bot_fraud_prepare_new_user_for_start_gift')) $newUser = bot_fraud_prepare_new_user_for_start_gift($newUser, $userID);
            if(function_exists('saveJson')) saveJson("melat/$userID.json", $newUser);
            elseif(function_exists('bot_data_put_json')) bot_data_put_json("melat/$userID.json", $newUser);
            $user = array_merge($user, $newUser);
        }
    }elseif(isset($msg) && preg_match('/^\/start\s+(.+)$/', trim((string)$msg), $startMatch) && function_exists('bot_referral_register_start_payload')){
        // ترمیم کاربرهای تازه‌ای که در نسخه‌های قبلی با جوین اجباری، بدون sub ساخته شده‌اند.
        $reg = bot_referral_register_start_payload($userID, $startMatch[1], $user, true);
        if(is_array($reg) && !empty($reg['ok']) && function_exists('bot_data_get_json')){
            $loadedUser = bot_data_get_json("melat/$userID.json", []);
            if(is_array($loadedUser) && !empty($loadedUser)) $user = array_merge($user, $loadedUser);
        }
    }
    if(isset($data) && (string)$data === 'forced_join_check' && !empty($data_id)){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'هنوز عضویت کامل نشده. اول عضو همه کانال‌های قفل‌شده شو بعد دوباره بررسی کن.', 'show_alert'=>true]);
    }
    bot_send_forced_join_message($chatID, $forcedJoinMissingChannels);
    exit();
}
if(!$isAdmin && isset($Tc) && $Tc == 'private' && empty($forcedJoinMissingChannels) && isset($data) && (string)$data === 'forced_join_check'){
    if(function_exists('bot_fraud_award_pending_start_gift')) bot_fraud_award_pending_start_gift($userID, true);
    $refVerifyResult = function_exists('bot_referral_verify_forced_join_and_reward') ? bot_referral_verify_forced_join_and_reward($userID, true, isset($forcedJoinChannels) && is_array($forcedJoinChannels) ? $forcedJoinChannels : []) : ['ok'=>false,'reason'=>'function_missing'];
    if(function_exists('bot_referral_verify_log')) bot_referral_verify_log($userID, '', $refVerifyResult, ['source'=>'forced_join_check_callback']);
    if(function_exists('bot_data_get_json')){
        $loadedUser = bot_data_get_json("melat/$userID.json", []);
        if(is_array($loadedUser) && !empty($loadedUser)) $user = array_merge($user, $loadedUser);
    }
    if(!empty($data_id)) bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'✅ عضویت تأیید شد. /start اجرا شد.', 'show_alert'=>false]);
    if(function_exists('bot_forced_join_cleanup_inline_prompt')) bot_forced_join_cleanup_inline_prompt($chatID, $msg_id ?? null);
    if(function_exists('bot_after_forced_join_send_start_screen')){
        bot_after_forced_join_send_start_screen($chatID, $userID, $user, $isAdmin, $starttext, $Button_Home, $Button_Admin ?? null);
    }else{
        bot_show_user_main_menu($chatID, $user, $userID);
    }
    exit();
}

if(isset($Tc) && $Tc == 'private' && !empty($userID) && function_exists('bot_stats_mark_active')){
    bot_stats_mark_active($userID, 'private_interaction');
}

$melat = bot_data_get_json("melat.json");
$member_online = $melat["members"];
//#######################################################
// بررسی خروج کاربران از کانال‌های سفارش: قبلاً فقط در منوی انتقال اجرا می‌شد.
// اکنون در هر تعامل خصوصی کاربر اجرا می‌شود تا خروج از کانال سریع‌تر تشخیص داده شود.
if(!empty($userID) && !$isAdmin && isset($Tc) && $Tc == 'private' && bot_data_file_exists("melat/$userID.json") && function_exists('bale_left_interaction_auto_enabled') && bale_left_interaction_auto_enabled()){
    $shouldRunLeftCheck = function_exists('bot_scale_should_run_user_task') ? bot_scale_should_run_user_task($userID, 'left_check', (defined('BOT_LEFT_CHECK_INTERVAL') ? (int)BOT_LEFT_CHECK_INTERVAL : 600)) : true;
    if($shouldRunLeftCheck){
        bale_check_left_for_user_orders($userID, true, 2);
        $user = bot_data_get_json("melat/$userID.json");
    }
}
//#######################################################
function Spam($userID){
    global $chatID, $isAdmin, $Tc;
    // Anti-spam فقط برای چت خصوصی کاربر با ربات فعال است.
    // کانال سفارشات، گروه‌ها و callbackهای داخل کانال نباید محدود شوند.
    if(isset($Tc) && (string)$Tc !== 'private') return;
    if(!empty($chatID) && !empty($userID) && (string)$chatID !== (string)$userID) return;
    if(function_exists('bot_antispam_guard')){
        bot_antispam_guard($userID, $chatID, isset($isAdmin) ? (bool)$isAdmin : false, isset($Tc) ? (string)$Tc : null);
        return;
    }
    // Fallback for installations that did not upload AntiSpamService.php yet.
    $spam_status = bot_data_get_json("lib/spam/$userID.json", []);
    if(!is_array($spam_status)) $spam_status = [];
    if(isset($spam_status[0]) && mb_strpos((string)$spam_status[0],"time") !== false){
        if((int)str_replace("time ","",(string)$spam_status[0]) >= time()) exit(false);
        $spam_status = [1,time()+2];
    }elseif(isset($spam_status[1]) && time() < (int)$spam_status[1]){
        if(((int)($spam_status[0] ?? 0))+1 > 3){
            $time = time() + 15;
            $spam_status = ["time $time"];
            bot_data_put_json("lib/spam/$userID.json", $spam_status);
            bot('SendMessage',[
                'chat_id'=>$userID,
                'text'=>"⚠️کمی آهسته‌تر با ربات کار کنید

⛔️حساب شما به مدت ۱۵ ثانیه محدود شد",
            ]);
            exit(false);
        }else{
            $spam_status = [((int)($spam_status[0] ?? 0))+1,(int)$spam_status[1]];
        }
    }else{
        $spam_status = [1,time()+2];
    }
    bot_data_put_json("lib/spam/$userID.json", $spam_status);
}
Spam($userID);
//#######################################################
if($warn >= 3){
bot('sendMessage',['chat_id'=>$chatID,'text'=>"📍 شما سه اخطار دریافت کردید و از ربات مسدود شدید",'parse_mode'=>"HTML",
]); exit();}
//#################کیبورد مدیریت###################################
$Button_Panel = json_encode(['keyboard'=>[
[['text'=>"📈 آمار ربات"],['text'=>"👤 جستجوی کاربر"]],
[['text'=>"📦 سفارش‌ها"],['text'=>"📨 ارسال پیام"]],
[['text'=>"🎫 تیکت‌ها"],['text'=>"🪙 سکه همگانی"]],
[['text'=>"👥 آمار رفرال"],['text'=>"👥 رفرال‌گیری"]],
[['text'=>"📌ثبت سفارش"],['text'=>"🛍 مدیریت فروشگاه"]],
[['text'=>"📊 وضعیت ارسال همگانی"],['text'=>"▶️ اجرای فوری صف همگانی"]],
[['text'=>"🚪 جریمه لفت"],['text'=>"🔄 بررسی فوری لفت‌ها"]],
[['text'=>"💾 بکاپ دیتابیس"],['text'=>"🧾 بکاپ تنظیمات"],['text'=>"📥 ورود بکاپ"]],
[['text'=>"⚙️ تنظیمات وب"],['text'=>"🌐 پنل وب"]],
[['text'=>"🧰 ابزارهای سریع"],['text'=>"👥 مشاهده پنل کاربران عادی"]],
[['text'=>"🔙بازگشت به منوی ادمین"]],
],'resize_keyboard'=>true]);
$Button_back_panel = json_encode(['keyboard'=>[
[['text'=>"🔙بازگشت به منوی ادمین"]],
[['text'=>"🔙بازگشت به منو"]],
],'resize_keyboard'=>true]);
//##############دکمه منوی اصلی#################################
if(function_exists('bot_home_purge_removed_menu_tokens')) bot_home_purge_removed_menu_tokens();
// Do not auto-restore or force-enable home buttons on every webhook.
// The web panel is the source of truth for layout and visible/hidden buttons.
$Button_Home = bot_home_build_reply_keyboard();

// v58: guard همه مراحل عددی/متنی؛ لغو استاندارد و جلوگیری از گیرکردن state.
if(function_exists('bot_state_runtime_guard') && bot_state_runtime_guard()){ exit; }

// از نسخه v49 به بعد، تنظیمات سنگین از پنل ربات به پنل وب منتقل شده‌اند.
// این intercept قبل از routerهای قدیمی اجرا می‌شود تا دکمه‌های قدیمی دوباره منوی شلوغ نسازند.
if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($msg) && function_exists('bot_admin_web_shortcut_router') && bot_admin_web_shortcut_router($msg)){ exit; }

// Router جدید تنظیم متن و فروشگاه قبل از handlerهای قدیمی اجرا می‌شود.
if(function_exists('bot_text_settings_runtime_router') && bot_text_settings_runtime_router()){ exit; }
if(function_exists('bot_reaction_runtime_router') && bot_reaction_runtime_router()){ exit; }
if(function_exists('bot_sponsor_runtime_router') && bot_sponsor_runtime_router()){ exit; }
if(function_exists('bot_simple_shop_runtime_router') && bot_simple_shop_runtime_router()){ exit; }
if(function_exists('bot_violation_runtime_router') && bot_violation_runtime_router()){ exit; }
if(function_exists('bot_antispam_runtime_router') && bot_antispam_runtime_router()){ exit; }
if(function_exists('bot_referral_runtime_router') && bot_referral_runtime_router()){ exit; }
if(function_exists('bot_gift_runtime_router') && bot_gift_runtime_router()){ exit; }
if(function_exists('bot_daily_runtime_router') && bot_daily_runtime_router()){ exit; }
if(function_exists('bot_admin_tools_runtime_router') && bot_admin_tools_runtime_router()){ exit; }
if(function_exists('bot_adv_runtime_router') && bot_adv_runtime_router()){ exit; }
if(function_exists('bot_adv_notice_guard')) bot_adv_notice_guard();

// ================= HARD OVERRIDE: clean card-to-card shop =================
// این بلوک قبل از فروشگاه قدیمی اجرا می‌شود تا مسیرهای قدیمی فروشگاه دیگر تداخل ایجاد نکنند.
if(isset($Tc) && $Tc == 'private'){
    // مرحله تنظیم بسته‌ها توسط ادمین
    if(isset($message) && $isAdmin && isset($step) && preg_match('/^simpkg_(\d+)_(label|amount|coins)$/', (string)$step, $msk2)){
        $idx = (int)$msk2[1];
        $field = $msk2[2];
        $value = trim((string)($msg ?? ''));
        if(bot_is_menu_back_text($value) || bot_is_admin_menu_back_text($value)){
            $user['step']='none'; saveJson("melat/$userID.json", $user);
            SM($chatID, bot_simple_shop_packages_admin_text(), 'html', null, bot_simple_shop_packages_admin_keyboard());
            exit;
        }
        $ok = bot_simple_shop_save_package_field($idx, $field, $value);
        if(!$ok){
            $title = $field === 'label' ? 'نام بسته' : ($field === 'amount' ? 'قیمت به ریال' : 'مقدار الماس');
            SM($chatID, "❌ مقدار واردشده برای {$title} معتبر نیست. دوباره ارسال کنید.", 'html', null, $Button_back_panel);
            exit;
        }
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, "✅ بسته {$idx} ذخیره شد.", 'html', null, bot_simple_shop_packages_admin_keyboard());
        exit;
    }

    // مرحله تنظیم کارت توسط ادمین
    if(isset($message) && $isAdmin && isset($step) && preg_match('/^simpcard_(number|holder|bank|note)$/', (string)$step, $mck2)){
        $value = trim((string)($msg ?? ''));
        if(bot_is_menu_back_text($value) || bot_is_admin_menu_back_text($value)){
            $user['step']='none'; saveJson("melat/$userID.json", $user);
            SM($chatID, bot_simple_shop_card_admin_text(), 'html', null, bot_simple_shop_card_admin_keyboard());
            exit;
        }
        $ok = bot_simple_shop_save_card_setting($mck2[1], $value);
        if(!$ok){
            SM($chatID, "❌ مقدار معتبر نیست. دوباره ارسال کنید.", 'html', null, $Button_back_panel);
            exit;
        }
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, "✅ اطلاعات کارت ذخیره شد.", 'html', null, bot_simple_shop_card_admin_keyboard());
        exit;
    }

    // پاسخ ادمین به کاربر درباره رسید، بدون دانلود فایل روی هاست
    if(isset($message) && $isAdmin && isset($step) && preg_match('/^manualpay_reply_(\d+)$/', (string)$step, $mrp)){
        $rid = $mrp[1];
        if(bot_is_menu_back_text($msg ?? '') || bot_is_admin_menu_back_text($msg ?? '')){
            $user['step']='none'; saveJson("melat/$userID.json", $user);
            SM($chatID, '✅ ارسال پاسخ لغو شد.', 'html', null, $Button_Panel);
            exit;
        }
        $rec = bot_manual_receipt_get($rid);
        if(!$rec){
            $user['step']='none'; saveJson("melat/$userID.json", $user);
            SM($chatID, '❌ رسید پیدا نشد.', 'html', null, $Button_Panel);
            exit;
        }
        bot('sendMessage', ['chat_id'=>$rec['user_id'], 'text'=>"💬 پیام پشتیبانی درباره رسید #{$rid}:"]);
        $copied = bot('copyMessage', ['chat_id'=>$rec['user_id'], 'from_chat_id'=>$chatID, 'message_id'=>$msg_id]);
        if(!is_object($copied) || empty($copied->ok)){
            $txt = trim((string)($msg ?? ''));
            if($txt !== '') bot('sendMessage', ['chat_id'=>$rec['user_id'], 'text'=>$txt]);
        }
        bot_manual_receipt_update_data($rid, ['last_admin_reply_at'=>time(), 'last_admin_reply_by'=>(string)$userID]);
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, "✅ پیام شما برای کاربر <code>{$rec['user_id']}</code> ارسال شد.", 'html', null, bot_manual_receipt_admin_keyboard($rid, $rec['user_id']));
        exit;
    }

    // دریافت رسید کارت به کارت کاربر
    if(isset($message) && isset($step) && preg_match('/^manual_receipt_(\d+)$/', (string)$step, $mrs)){
        if(bot_is_menu_back_text($msg ?? '')){
            $user['step']='none'; saveJson("melat/$userID.json", $user);
            bot_show_user_main_menu($chatID, $user, $userID);
            exit;
        }
        $p = bot_simple_shop_find_package((int)$mrs[1]);
        if(!$p){
            $user['step']='none'; saveJson("melat/$userID.json", $user);
            SM($chatID, '❌ این بسته دیگر فعال نیست. دوباره از فروشگاه انتخاب کنید.', 'html', null, $Button_Home);
            exit;
        }
        $rtype = 'text';
        $rvalue = trim((string)($msg ?? ''));
        if(isset($message->photo) && is_array($message->photo) && count($message->photo) > 0){
            $last = end($message->photo);
            $rvalue = (string)($last->file_id ?? '');
            $rtype = 'photo';
        } elseif(isset($message->document) && isset($message->document->file_id)){
            $rvalue = (string)$message->document->file_id;
            $rtype = 'document';
        }
        if($rvalue === ''){
            SM($chatID, '❌ رسید معتبر دریافت نشد. عکس رسید، فایل رسید یا کد پیگیری را ارسال کنید.', 'html', null, null);
            exit;
        }
        $rid = bot_manual_receipt_create($userID, $p, $rtype, $rvalue, ['username'=>$username ?? '', 'first_name'=>$first_name ?? '', 'from_chat_id'=>$chatID, 'message_id'=>$msg_id]);
        bot_manual_receipt_notify_admin($admin, $rid, $p, $userID, $rtype, $rvalue, (string)($first_name ?? ''), ['from_chat_id'=>$chatID, 'message_id'=>$msg_id]);
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, "✅ رسید شما ثبت شد.\n\n🧾 شناسه رسید: <code>{$rid}</code>\nبعد از تأیید ادمین، حساب شما شارژ می‌شود.", 'html', null, $Button_Home);
        exit;
    }

    // باز کردن فروشگاه کاربر یا ادمین
    if(isset($msg) && $isAdmin && (bot_simple_shop_is_admin_text($msg) || bot_simple_shop_admin_legacy_text($msg))){
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, bot_simple_shop_admin_text(), 'html', null, bot_simple_shop_admin_keyboard());
        exit;
    }
    if(isset($msg) && !$isAdmin && bot_simple_shop_is_user_text($msg)){
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, bot_simple_shop_user_text(), 'html', null, bot_simple_shop_user_keyboard());
        exit;
    }

    // callbackهای عمومی فروشگاه کاربر
    if(isset($data) && preg_match('/^simpay_pkg_(\d+)$/', (string)$data, $msp)){
        $p = bot_simple_shop_find_package((int)$msp[1]);
        if(!$p){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'این بسته فعال نیست.', 'show_alert'=>true]); exit; }
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بسته انتخاب شد', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_package_text($p), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_payment_keyboard($p)]);
        exit;
    }
    if(isset($data) && in_array((string)$data, ['simpay_back', 'shop-back'], true)){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'فروشگاه', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_user_text(), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_user_keyboard()]);
        exit;
    }
    if(isset($data) && (string)$data === 'simpay_help'){
        $txt = "📋 **راهنمای خرید**\n\n".
               "1️⃣ بسته موردنظر را انتخاب کنید.\n".
               "2️⃣ گزینه کارت‌به‌کارت را بزنید.\n".
               "3️⃣ مبلغ را به کارت اعلام‌شده واریز کنید.\n".
               "4️⃣ رسید را ارسال کنید.\n".
               "5️⃣ پس از تأیید ادمین، موجودی شما شارژ می‌شود.";
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'راهنما', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>$txt, 'parse_mode'=>'HTML', 'reply_markup'=>json_encode(['inline_keyboard'=>[[['text'=>'🔙 برگشت به فروشگاه','callback_data'=>'simpay_back']]]], JSON_UNESCAPED_UNICODE)]);
        exit;
    }
    if(isset($data) && preg_match('/^simpay_card_(\d+)$/', (string)$data, $mcard)){
        $p = bot_simple_shop_find_package((int)$mcard[1]);
        if(!$p){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'این بسته فعال نیست.', 'show_alert'=>true]); exit; }
        if(!bot_simple_shop_card_ready()){
            bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'شماره کارت یا نام گیرنده هنوز توسط ادمین تنظیم نشده است.', 'show_alert'=>true]);
            exit;
        }
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'اطلاعات کارت', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_card_text($p), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_card_keyboard($p)]);
        exit;
    }
    if(isset($data) && preg_match('/^simpay_receipt_(\d+)$/', (string)$data, $mrec)){
        $p = bot_simple_shop_find_package((int)$mrec[1]);
        if(!$p){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'این بسته فعال نیست.', 'show_alert'=>true]); exit; }
        $user['step'] = 'manual_receipt_'.$p['index']; saveJson("melat/$userID.json", $user);
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'رسید را ارسال کنید', 'show_alert'=>false]);
        SM($chatID, "📤 رسید پرداخت کارت‌به‌کارت را ارسال کنید.\n\nمی‌توانید عکس رسید، فایل رسید یا کد پیگیری را بفرستید.", 'html', null, json_encode(['keyboard'=>[[['text'=>'🔙بازگشت به منو']]], 'resize_keyboard'=>true], JSON_UNESCAPED_UNICODE));
        exit;
    }
    if(isset($data) && preg_match('/^simpay_(?:zibal|zp)_(\d+)$/', (string)$data, $mzp)){
        $p = bot_simple_shop_find_package((int)$mzp[1]);
        if(!$p){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'این بسته فعال نیست.', 'show_alert'=>true]); exit; }
        if(!function_exists('bot_zibal_request_payment')){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'درگاه آنلاین فعال نیست.', 'show_alert'=>true]); exit; }
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'در حال ساخت لینک پرداخت...', 'show_alert'=>false]);
        $phone = (string)($user['phone'] ?? '');
        $res = bot_zibal_request_payment($userID, (int)$p['amount'], "خرید {$p['coins']} $money", $phone, 'coin', (int)$p['coins'], ['item'=>$p, 'simple_shop'=>1]);
        if(empty($res['ok'])){
            $err = $res['error'] ?? 'unknown';
            SM($chatID, "❌ ساخت لینک پرداخت انجام نشد.\nکد خطا: <code>{$err}</code>", 'html', null, bot_simple_shop_payment_keyboard($p));
            exit;
        }
        SM($chatID, bot_simple_shop_package_text($p), 'html', null, bot_shop_pay_keyboard($res['payment_url'], 'simpay_pkg_'.$p['index']));
        exit;
    }

    // callbackهای مدیریت فروشگاه
    if(isset($data) && $isAdmin && in_array((string)$data, ['simpadmin_shop','backshop'], true)){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'مدیریت فروشگاه', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_admin_text(), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_admin_keyboard()]);
        exit;
    }
    if(isset($data) && $isAdmin && (string)$data === 'simpadmin_packages'){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بسته‌ها', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_packages_admin_text(), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_packages_admin_keyboard()]);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^simpkg_(\d+)_(label|amount|coins)$/', (string)$data, $msk)){
        $user['step'] = 'simpkg_'.$msk[1].'_'.$msk[2]; saveJson("melat/$userID.json", $user);
        $title = $msk[2] === 'label' ? 'نام بسته' : ($msk[2] === 'amount' ? 'قیمت بسته به ریال' : 'مقدار الماس بسته');
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>$title.' را ارسال کنید', 'show_alert'=>false]);
        SM($chatID, "✏️ {$title} را برای بسته {$msk[1]} ارسال کنید.", 'html', null, $Button_back_panel);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^simpkg_(\d+)_delete$/', (string)$data, $mdel)){
        bot_simple_shop_clear_package((int)$mdel[1]);
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بسته حذف شد', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_packages_admin_text(), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_packages_admin_keyboard()]);
        exit;
    }
    if(isset($data) && $isAdmin && (string)$data === 'simpadmin_card'){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'تنظیم کارت', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_card_admin_text(), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_card_admin_keyboard()]);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^simpcard_(number|holder|bank|note)$/', (string)$data, $mck)){
        $user['step'] = 'simpcard_'.$mck[1]; saveJson("melat/$userID.json", $user);
        $titles = ['number'=>'شماره کارت', 'holder'=>'نام گیرنده', 'bank'=>'نام بانک', 'note'=>'متن راهنمای رسید'];
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'مقدار را ارسال کنید', 'show_alert'=>false]);
        SM($chatID, "✏️ {$titles[$mck[1]]} را ارسال کنید.", 'html', null, $Button_back_panel);
        exit;
    }
    if(isset($data) && $isAdmin && (string)$data === 'simpadmin_receipts'){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'رسیدها', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_pending_receipts_text(), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_pending_receipts_keyboard()]);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^simpadmin_receipt_(\d+)$/', (string)$data, $mrd)){
        $rid = $mrd[1];
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'جزئیات رسید', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_receipt_detail_text($rid), 'parse_mode'=>'HTML', 'reply_markup'=>bot_manual_receipt_admin_keyboard($rid)]);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_reply_(\d+)$/', (string)$data, $mrp)){
        $rid = $mrp[1];
        $rec = bot_manual_receipt_get($rid);
        if(!$rec){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'رسید پیدا نشد.', 'show_alert'=>true]); exit; }
        $user['step']='manualpay_reply_'.$rid; saveJson("melat/$userID.json", $user);
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'پیام پاسخ را ارسال کنید', 'show_alert'=>false]);
        SM($chatID, "💬 پاسخ خود را برای کاربر <code>{$rec['user_id']}</code> ارسال کنید.

هر نوع پیام متنی/عکس/فایل را می‌توانی بفرستی؛ ربات بدون دانلود روی هاست آن را برای کاربر کپی می‌کند.", 'html', null, $Button_back_panel);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_(approve|reject)_(\d+)$/', (string)$data, $mmp)){
        if(function_exists('bot_manual_receipt_handle_admin_action')){
            bot_manual_receipt_handle_admin_action($data_id, $chatID, $msg_id, $userID, $mmp[1], $mmp[2]);
        }else{
            bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'هندلر رسید فعال نیست.', 'show_alert'=>true]);
        }
        exit;
    }
    if(isset($data) && (string)$data === 'noop'){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'', 'show_alert'=>false]);
        exit;
    }
}
// ================= /HARD OVERRIDE: clean card-to-card shop =================

// ================= Simplified shop/referral cleanup handlers =================
// این بخش قبل از handlerهای قدیمی اجرا می‌شود تا فروشگاه جدید و منوی خلوت‌شده با کدهای قدیمی تداخل نداشته باشد.
function bot_simplified_disabled_admin_feature($label){
    return in_array(trim((string)$label), [
        '♾‌دکمه ها','♾ دکمه ها','🔘چینش دکمه های ربات🔘','🔘طرح دکمه های کانال🔘',
        '🏦 مبادلات الماس','🏦 مبادلات','💎 تنظیمات انتقال الماس','تنظیمات انتقال الماس','💳 بانک انتقال','💳بانک انتقال',
        '♻️پنـل ها','♻️ پنـل ها','🎯تغییر پنل','🎯 تغییر پنل','⏳اشتراک باقی مانده','〽️ پـنـل هـا',
        '🏆 برترین اعضا','🏆برترین اعضا','🏆 برترین ها','🏆برترین ها','📚راهنـما','📚 راهنما','راهنما'
    ], true);
}
function bot_simplified_compact_text($label){
    $label = trim((string)$label);
    $label = str_replace(["\xE2\x80\x8C", "\xE2\x80\x8D"], '', $label); // نیم‌فاصله‌های مخفی
    $label = preg_replace('/[\s\x{200c}\x{200d}\x{0640}]+/u', '', $label);
    $label = preg_replace('/[^\p{L}\p{N}]+/u', '', $label);
    return $label ?: '';
}
function bot_simplified_is_order_tracking_text($label, array $extraLabels=[]){
    $label = trim((string)$label);
    if($label === '') return false;
    $known = array_merge($extraLabels, [
        '🔍 پیگیری ها','🔍پیگیری ها','پیگیری ها','پیگیری‌ها',
        '🔍 پیگیری سفارشات','🔍پیگیری سفارشات🔍','📋 پیگیری سفارشات','پیگیری سفارشات','پیگیری سفارش'
    ]);
    foreach($known as $v){
        if(trim((string)$v) !== '' && $label === trim((string)$v)) return true;
    }
    $compact = bot_simplified_compact_text($label);
    return in_array($compact, ['پیگیریها','پیگیریها','پیگیریسفارشات','پیگیریسفارش'], true);
}
function bot_simplified_is_removed_transfer_text($label, $money='الماس'){
    $label = trim((string)$label);
    if($label === '') return false;
    $exact = [
        '💳 بانک انتقال','💳بانک انتقال','🏦 مبادلات الماس','🏦 مبادلات',
        'تاریخچه دریافت','تاریخچه انتقال','انتقال الماس','💎 انتقال الماس'
    ];
    if(in_array($label, $exact, true)) return true;
    if(mb_strpos($label, 'بانک انتقال', 0, 'UTF-8') !== false) return true;
    if(mb_strpos($label, 'مبادلات الماس', 0, 'UTF-8') !== false) return true;
    if(mb_strpos($label, 'تنظیمات انتقال', 0, 'UTF-8') !== false) return true;
    if(mb_strpos($label, 'تاریخچه انتقال', 0, 'UTF-8') !== false) return true;
    if(mb_strpos($label, 'تاریخچه دریافت', 0, 'UTF-8') !== false) return true;
    if($label === 'انتقال '.$money) return true;
    $compact = bot_simplified_compact_text($label);
    $moneyCompact = bot_simplified_compact_text($money);
    if($compact === 'انتقال'.$moneyCompact || $compact === 'انتقالالماس') return true;
    return in_array($compact, ['بانکانتقال','مبادلات','مبادلاتالماس','تاریخچهدریافت','تاریخچهانتقال','تنظیماتانتقالالماس'], true);
}
function bot_simplified_removed_transfer_reply($chatID, &$user, $userID, $Button_Home){
    $user['step'] = 'none';
    saveJson("melat/$userID.json", $user);
    SM($chatID, "❌ این دکمه قدیمی حذف شده است.

برای شارژ حساب از فروشگاه استفاده کنید.", 'html', null, $Button_Home);
}
function bot_simplified_clear_removed_transfer_step(&$user, $userID){
    if(isset($user['step']) && preg_match('/^(sendcoin|transfer-)/', (string)$user['step'])){
        $user['step'] = 'none';
        saveJson("melat/$userID.json", $user);
        return true;
    }
    return false;
}
function bot_simplified_is_removed_transfer_callback($data){
    $data = trim((string)$data);
    if($data === '') return false;
    if(preg_match('/^(trnfr_|trnfrs-|transfer-|sendcoin|sendcoin-|oldtransfer|diamond_transfer)/', $data)) return true;
    return in_array($data, ['transfer_bank','transfer_history','receive_history','diamond_bank','diamond_history'], true);
}
if(!function_exists('bot_simple_add_points_to_user')){
function bot_simple_add_points_to_user($targetUserId, $amount, $reason='manual_shop_receipt', array $extra=[]){
    $amount = (int)$amount;
    if($amount <= 0) return ['ok'=>false, 'error'=>'bad_amount'];
    if(function_exists('bot_wallet_add')){
        $res = bot_wallet_add($targetUserId, $amount, $reason, $extra);
        if(is_array($res) && !empty($res['ok'])) return $res;
    }
    $u = bot_data_get_json('melat/'.$targetUserId.'.json', []);
    if(!is_array($u)) $u = [];
    $before = (int)($u['Points'] ?? 0);
    $u['Points'] = $before + $amount;
    saveJson('melat/'.$targetUserId.'.json', $u);
    return ['ok'=>true, 'before'=>$before, 'after'=>$u['Points']];
}
}

if(isset($Tc) && $Tc == 'private'){
    // دکمه‌های شیشه‌ای خنثی/قدیمی نباید به هیچ مسیر قدیمی سقوط کنند.
    if(isset($data) && in_array((string)$data, ['0','noop','shop-noop'], true)){
        if(isset($step) && preg_match('/^(sendcoin|transfer-)/', (string)$step)){
            bot_simplified_clear_removed_transfer_step($user, $userID);
            $step = 'none';
        }
        if(isset($data_id)) bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'این دکمه عملیاتی ندارد.', 'show_alert'=>false]);
        exit;
    }
    if(isset($data) && bot_simplified_is_removed_transfer_callback($data)){
        bot_simplified_clear_removed_transfer_step($user, $userID);
        $step = 'none';
        if(isset($data_id)) bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'این دکمه حذف شده است.', 'show_alert'=>true]);
        exit;
    }
    if(isset($data) && isset($step) && preg_match('/^(sendcoin|transfer-)/', (string)$step)){
        // اگر کاربر قبلاً در step حذف‌شده مانده باشد، با کلیک روی دکمه‌های شیشه‌ای فقط step پاک می‌شود
        // و همان callback فعلی فرصت پردازش عادی پیدا می‌کند.
        bot_simplified_clear_removed_transfer_step($user, $userID);
        $step = 'none';
    }
    // اولویت قطعی با پیگیری سفارشات است؛ اگر متن دکمه‌های قدیمی با بانک انتقال قاطی شده باشد، دیگر وارد مسیر حذف‌شده نمی‌شود.
    $trackingTextLabels = [];
    if(isset($dok6)) $trackingTextLabels[] = (string)$dok6;
    if(isset($dokp1)) $trackingTextLabels[] = (string)$dokp1;
    if(isset($msg) && bot_simplified_is_order_tracking_text($msg, $trackingTextLabels)){
        $user['step'] = 'none';
        saveJson("melat/$userID.json", $user);
        if(function_exists('bale_orders_dashboard_text') && function_exists('bale_orders_dashboard_keyboard')){
            bot('sendMessage', [
                'chat_id' => $chatID,
                'text' => bale_orders_dashboard_text($userID, $money ?? 'الماس'),
                'parse_mode' => 'html',
                'reply_markup' => bale_orders_dashboard_keyboard($userID),
            ]);
        }else{
            SM($chatID, "📋 پیگیری سفارشات\n\nدر حال حاضر لیست سفارش‌ها قابل بارگذاری نیست.", 'html', null, $Button_Home);
        }
        exit;
    }
    if(isset($data) && ((string)$data === 'payorders' || (string)$data === 'orders-refresh' || (string)$data === 'backpaybutton')){
        $user['step'] = 'none';
        saveJson("melat/$userID.json", $user);
        if(function_exists('bale_show_orders_dashboard')){
            if(isset($data_id)) bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'پیگیری سفارشات', 'show_alert'=>false]);
            bale_show_orders_dashboard($chatID, $msg_id, $userID, $money ?? 'الماس');
        }else{
            bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'لیست سفارش‌ها آماده نیست.', 'show_alert'=>true]);
        }
        exit;
    }
    // حذف کامل دکمه قدیمی: فقط پیام‌های متنی/کیبورد معمولی را می‌بندیم؛ callbackها بالا پاکسازی می‌شوند.
    if((!isset($data) && isset($msg) && bot_simplified_is_removed_transfer_text($msg, $money ?? 'الماس')) || (!isset($data) && isset($step) && preg_match('/^(sendcoin|transfer-)/', (string)$step))){
        bot_simplified_removed_transfer_reply($chatID, $user, $userID, $Button_Home);
        exit;
    }
    // راهنما باید مثل سایر متن‌ها از پنل وب/تنظیم متن خوانده شود و برای ادمین هم در حالت مشاهده کاربر باز باشد.
    if(isset($msg) && isset($dok11) && trim((string)$msg) === trim((string)$dok11) && $Tc == 'private'){
        $user['step'] = 'none'; if(function_exists('saveJson')) saveJson("melat/$userID.json", $user);
        $helpText = isset($doktxt11) ? (string)$doktxt11 : '';
        if($helpText === '' || mb_strpos($helpText, 'متن این بخش باید از پنل مدیریت', 0, 'UTF-8') !== false){
            $helpText = function_exists('bot_text_settings_get') ? bot_text_settings_get('doktxt11') : '🌐 راهنما';
        }
        if(function_exists('bot_text_settings_apply_vars')) $helpText = bot_text_settings_apply_vars($helpText, function_exists('bot_text_settings_user_vars') ? bot_text_settings_user_vars() : []);
        SM($chatID, $helpText, 'MarkDown', $msg_id, $Button_Home ?? null);
        exit;
    }

    // حذف مسیرهای قدیمی که دیگر نباید در ربات استفاده شوند.
    if(isset($msg) && $isAdmin && bot_simplified_disabled_admin_feature($msg)){
        SM($chatID, "❌ این بخش از ربات حذف شده است.", 'html', null, $Button_Panel);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^(sets-|taeh_dokc)/', (string)$data)){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'این بخش از نسخه سبک حذف شده است.', 'show_alert'=>true]);
        exit;
    }
    // فروشگاه جدید کاربر
    $shopLabels = [];
    if(isset($dok9)) $shopLabels[] = (string)$dok9;
    $shopLabels = array_merge($shopLabels, ['🛍 فروشگاه','🛍فروشگاه','🛍 فروشـگاه','فروشگاه']);
    if(isset($msg) && in_array(trim((string)$msg), array_unique($shopLabels), true)){
        // حتی اگر ادمین از «مشاهده پنل کاربران عادی» فروشگاه را بزند، فروشگاه کاربر باز شود نه تنظیمات ادمین.
        $user['step'] = 'none'; saveJson("melat/$userID.json", $user);
        SM($chatID, bot_simple_shop_user_text(), 'html', null, bot_simple_shop_user_keyboard());
        exit;
    }
    // فروشگاه جدید پنل ادمین فقط از دکمه اختصاصی مدیریت فروشگاه باز می‌شود.
    if(isset($msg) && $isAdmin && in_array(trim((string)$msg), ['🛍 مدیریت فروشگاه','🛍مدیریت فروشگاه','🛍 تنظیم فروشگاه','تنظیم فروشگاه'], true)){
        $user['step'] = 'none'; saveJson("melat/$userID.json", $user);
        SM($chatID, bot_simple_shop_admin_text(), 'html', null, bot_simple_shop_admin_keyboard());
        exit;
    }
    // رفرال‌گیری ساده برای کاربران
    $refLabels = [];
    if(isset($dok4)) $refLabels[] = (string)$dok4;
    $refLabels = array_merge($refLabels, ['👥 رفرال‌گیری','👥رفرال‌گیری','رفرال گیری','رفرال‌گیری','👥جذب زیرمجموعه','👥 جذب زیرمجموعه']);
    if(isset($msg) && !$isAdmin && in_array(trim((string)$msg), array_unique($refLabels), true)){
        SM($chatID, bot_simple_referral_text($userID), 'html', null, $Button_Home);
        exit;
    }
    if(isset($msg) && $isAdmin && in_array(trim((string)$msg), ['👥 رفرال‌گیری','⚙️ زیرمجموعه گیری','⚙️ زیرمجموعه‌گیری'], true)){
        $txt = "👥 **رفرال‌گیری ساده**\n\n".
               "نام این بخش از زیرمجموعه‌گیری به رفرال‌گیری تغییر کرد.\n".
               "کاربرها لینک دعوت خود را از منوی کاربران می‌گیرند و آمار رفرال در حسابشان نمایش داده می‌شود.\n\n".
               "برای تغییر متن بنر/راهنما از بخش 📇 تنظیم متن استفاده کن.";
        SM($chatID, $txt, 'html', null, $Button_Panel);
        exit;
    }
    // برترین اعضا طبق درخواست حذف شده است.
    if(isset($msg) && $isAdmin && in_array(trim((string)$msg), ['🏆 برترین اعضا','🏆برترین اعضا','🏆 برترین ها','🏆برترین ها'], true)){
        SM($chatID, '❌ بخش برترین اعضا از ربات حذف شده است.', 'html', null, $Button_Panel);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^simpletop_/', (string)$data)){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بخش برترین اعضا حذف شده است.', 'show_alert'=>true]);
        exit;
    }
    // callbackهای فروشگاه کاربر
    if(isset($data) && preg_match('/^simpay_pkg_(\d+)$/', (string)$data, $msp)){
        $p = bot_simple_shop_find_package((int)$msp[1]);
        if(!$p){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بسته فعال نیست.', 'show_alert'=>true]); exit; }
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بسته انتخاب شد', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_package_text($p), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_payment_keyboard($p)]);
        exit;
    }
    if(isset($data) && (string)$data === 'simpay_back'){
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_user_text(), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_user_keyboard()]);
        exit;
    }
    if(isset($data) && (string)$data === 'simpay_help'){
        $txt = "📋 **راهنمای خرید**\n\n".
               "۱) بسته موردنظر را انتخاب کنید.\n".
               "۲) پرداخت آنلاین زیبال یا کارت‌به‌کارت را انتخاب کنید.\n".
               "۳) در کارت‌به‌کارت، رسید را ارسال کنید تا ادمین تأیید کند.\n".
               "۴) بعد از تأیید، موجودی شما شارژ می‌شود.";
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>$txt, 'parse_mode'=>'HTML', 'reply_markup'=>json_encode(['inline_keyboard'=>[[['text'=>'🔙 برگشت به فروشگاه','callback_data'=>'simpay_back']]]], JSON_UNESCAPED_UNICODE)]);
        exit;
    }
    if(isset($data) && preg_match('/^simpay_card_(\d+)$/', (string)$data, $mcard)){
        $p = bot_simple_shop_find_package((int)$mcard[1]);
        if(!$p){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بسته فعال نیست.', 'show_alert'=>true]); exit; }
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'اطلاعات کارت', 'show_alert'=>false]);
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_card_text($p), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_card_keyboard($p)]);
        exit;
    }
    if(isset($data) && preg_match('/^simpay_receipt_(\d+)$/', (string)$data, $mrec)){
        $p = bot_simple_shop_find_package((int)$mrec[1]);
        if(!$p){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بسته فعال نیست.', 'show_alert'=>true]); exit; }
        $user['step'] = 'manual_receipt_'.$p['index']; saveJson("melat/$userID.json", $user);
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'رسید را ارسال کنید', 'show_alert'=>false]);
        SM($chatID, "📤 رسید پرداخت کارت‌به‌کارت را ارسال کنید.\n\nمی‌توانید عکس رسید یا کد پیگیری/متن رسید را بفرستید.", 'html', null, json_encode(['keyboard'=>[[['text'=>'🔙بازگشت به منو']]], 'resize_keyboard'=>true], JSON_UNESCAPED_UNICODE));
        exit;
    }
    if(isset($data) && preg_match('/^simpay_(?:zibal|zp)_(\d+)$/', (string)$data, $mzp)){
        $p = bot_simple_shop_find_package((int)$mzp[1]);
        if(!$p){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'بسته فعال نیست.', 'show_alert'=>true]); exit; }
        if(!function_exists('bot_zibal_request_payment')){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'درگاه آنلاین فعال نیست.', 'show_alert'=>true]); exit; }
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'در حال ساخت لینک پرداخت...', 'show_alert'=>false]);
        $phone = (string)($user['phone'] ?? '');
        $res = bot_zibal_request_payment($userID, (int)$p['amount'], "خرید {$p['coins']} $money", $phone, 'coin', (int)$p['coins'], ['item'=>$p, 'simple_shop'=>1]);
        if(empty($res['ok'])){
            $err = $res['error'] ?? 'unknown';
            SM($chatID, "❌ ساخت لینک پرداخت انجام نشد.\nکد خطا: <code>$err</code>", 'html', null, bot_simple_shop_payment_keyboard($p));
            exit;
        }
        SM($chatID, bot_simple_shop_package_text($p), 'html', null, bot_shop_pay_keyboard($res['payment_url'], 'simpay_pkg_'.$p['index']));
        exit;
    }
    // دریافت رسید کارت‌به‌کارت کاربر
    if(isset($message) && isset($step) && preg_match('/^manual_receipt_(\d+)$/', (string)$step, $mrs)){
        if(bot_is_menu_back_text($msg ?? '')){ $user['step']='none'; saveJson("melat/$userID.json", $user); bot_show_user_main_menu($chatID, $user, $userID); exit; }
        $p = bot_simple_shop_find_package((int)$mrs[1]);
        if(!$p){ $user['step']='none'; saveJson("melat/$userID.json", $user); SM($chatID, '❌ بسته انتخاب‌شده دیگر فعال نیست.', 'html', null, $Button_Home); exit; }
        $rtype = 'text'; $rvalue = trim((string)($msg ?? ''));
        if(isset($message->photo) && is_array($message->photo) && count($message->photo) > 0){
            $last = end($message->photo); $rvalue = (string)($last->file_id ?? ''); $rtype = 'photo';
        } elseif(isset($message->document) && isset($message->document->file_id)){
            $rvalue = (string)$message->document->file_id; $rtype = 'document';
        }
        if($rvalue === ''){ SM($chatID, '❌ رسید معتبر دریافت نشد. عکس رسید یا کد پیگیری را ارسال کنید.', 'html', null, null); exit; }
        $rid = bot_manual_receipt_create($userID, $p, $rtype, $rvalue, ['username'=>$username ?? '', 'first_name'=>$first_name ?? '', 'from_chat_id'=>$chatID, 'message_id'=>$msg_id]);
        bot_manual_receipt_notify_admin($admin, $rid, $p, $userID, $rtype, $rvalue, (string)($first_name ?? ''), ['from_chat_id'=>$chatID, 'message_id'=>$msg_id]);
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, "✅ رسید شما ثبت شد.\n\n🧾 شناسه رسید: <code>$rid</code>\nپس از تأیید ادمین، حساب شما شارژ می‌شود.", 'html', null, $Button_Home);
        exit;
    }
    // callbackهای مدیریت فروشگاه
    if(isset($data) && $isAdmin && (string)$data === 'simpadmin_shop'){
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_admin_text(), 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_admin_keyboard()]);
        exit;
    }
    if(isset($data) && $isAdmin && (string)$data === 'simpadmin_packages'){
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>'🔢 **تنظیم بسته‌های الماس**\n\nبرای هر بسته، نام، مبلغ و مقدار الماس را تنظیم کنید. بسته ناقص به کاربر نمایش داده نمی‌شود.', 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_packages_admin_keyboard()]);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^simpkg_(\d+)_(label|amount|coins)$/', (string)$data, $msk)){
        $user['step'] = 'simpkg_'.$msk[1].'_'.$msk[2]; saveJson("melat/$userID.json", $user);
        $title = $msk[2] === 'label' ? 'نام بسته' : ($msk[2] === 'amount' ? 'مبلغ بسته به ریال' : 'مقدار الماس');
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>$title.' را ارسال کنید', 'show_alert'=>false]);
        SM($chatID, "✏️ $title را برای بسته {$msk[1]} ارسال کنید.", 'html', null, $Button_back_panel);
        exit;
    }
    if(isset($message) && $isAdmin && isset($step) && preg_match('/^simpkg_(\d+)_(label|amount|coins)$/', (string)$step, $msk2)){
        $idx = (int)$msk2[1]; $field = $msk2[2]; $value = trim((string)$msg);
        if($field !== 'label'){
            $num = bot_simple_clean_int($value);
            if($num <= 0){ SM($chatID, '❌ عدد معتبر وارد کنید.', 'html', null, $Button_back_panel); exit; }
            $value = (string)$num;
        }
        $map = ['label'=>'aytem', 'amount'=>'amount', 'coins'=>'coinshop'];
        Save('lib/Button/'.$map[$field].$idx.'.txt', $value);
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, "✅ بسته $idx ذخیره شد.", 'html', null, bot_simple_shop_packages_admin_keyboard());
        exit;
    }
    if(isset($data) && $isAdmin && (string)$data === 'simpadmin_card'){
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>'💳 **تنظیم کارت به کارت**\n\nاطلاعات کارت مقصد را تنظیم کنید.', 'parse_mode'=>'HTML', 'reply_markup'=>bot_simple_shop_card_admin_keyboard()]);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^simpcard_(number|holder|bank|note)$/', (string)$data, $mck)){
        $user['step'] = 'simpcard_'.$mck[1]; saveJson("melat/$userID.json", $user);
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'مقدار را ارسال کنید', 'show_alert'=>false]);
        SM($chatID, "✏️ مقدار جدید را ارسال کنید.", 'html', null, $Button_back_panel);
        exit;
    }
    if(isset($message) && $isAdmin && isset($step) && preg_match('/^simpcard_(number|holder|bank|note)$/', (string)$step, $mck2)){
        bot_simple_shop_save_card_setting($mck2[1], trim((string)$msg));
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, "✅ تنظیمات کارت ذخیره شد.", 'html', null, bot_simple_shop_card_admin_keyboard());
        exit;
    }
    if(isset($data) && $isAdmin && (string)$data === 'simpadmin_receipts'){
        bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>bot_simple_shop_pending_receipts_text(), 'parse_mode'=>'HTML', 'reply_markup'=>json_encode(['inline_keyboard'=>[[['text'=>'🔙 بازگشت به فروشگاه','callback_data'=>'simpadmin_shop']]]], JSON_UNESCAPED_UNICODE)]);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_reply_(\d+)$/', (string)$data, $mrp)){
        $rid = $mrp[1];
        $rec = bot_manual_receipt_get($rid);
        if(!$rec){ bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'رسید پیدا نشد.', 'show_alert'=>true]); exit; }
        $user['step']='manualpay_reply_'.$rid; saveJson("melat/$userID.json", $user);
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'پیام پاسخ را ارسال کنید', 'show_alert'=>false]);
        SM($chatID, "💬 پاسخ خود را برای کاربر <code>{$rec['user_id']}</code> ارسال کنید.

هر نوع پیام متنی/عکس/فایل را می‌توانی بفرستی؛ ربات بدون دانلود روی هاست آن را برای کاربر کپی می‌کند.", 'html', null, $Button_back_panel);
        exit;
    }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_(approve|reject)_(\d+)$/', (string)$data, $mmp)){
        if(function_exists('bot_manual_receipt_handle_admin_action')){
            bot_manual_receipt_handle_admin_action($data_id, $chatID, $msg_id, $userID, $mmp[1], $mmp[2]);
        }else{
            bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'هندلر رسید فعال نیست.', 'show_alert'=>true]);
        }
        exit;
    }
}
// ================= /Simplified shop/referral cleanup handlers =================
//##############################################################
$password = $_GET['password'];
$am = $_GET['coin'];
$amount = $_GET['amount'];
$hurice = number_format($amount);
$frmid = $_GET['from_id'];
$type = $_GET['type'];
$factor = $_GET['factor'];
$panel = $_GET['panel'];
$daypanel = $_GET['daypanel'];
if($password == "sendaction"){
$user2 = bot_data_get_json("melat/$frmid.json");
//===================\\
if(!in_array($factor,$user2['factor'])){
if($type == "cucrobot-membergir-coin"){
$jtime = date("Y/m/d | H:i:s");
$coin = $user2['Points'] + $am;
$user2['Points']= $coin;
$user2['factor'][] = "$factor";
saveJson("melat/$frmid.json",$user2);
$dsepds = $shops + $amount; 
Save("lib/Button/shops.txt",$dsepds);
SM($frmid,"✅ پرداخت موفق\n$icmoney پرداخت شما به مبلغ $hurice ریال معادل $am $money پرداخت شد.\n\n💠 موجودی جدید شما: $coin $money\n⏱ زمان پرداخت: $jtime",'html');
if(function_exists('bot_notify_configured_admins')){
    bot_notify_configured_admins("#خرید_موفق
💡> تعداد $am $money توسط کاربر $frmid خریداری شد !
💡> مبلغ $hurice ریال در حساب فروش شما ثبت شد !

جهت تسویه به پنل مدیریت ربات مراجعه کنید!", 'html', null, [$admin]);
}else{
    SM($admin,"#خرید_موفق
💡> تعداد $am $money توسط کاربر $frmid خریداری شد !
💡> مبلغ $hurice ریال در حساب فروش شما ثبت شد !

جهت تسویه به پنل مدیریت ربات مراجعه کنید!",'html');
}
$lj = jdate('l'); //نام روز در هفته - کامل
$Fj = jdate('F'); //نام ماه از سال - کامل
$dj = jdate('d'); //شماره ی روز از ماه - ۲ رقمی
$yj = jdate('y'); //سال (به عدد) دو رقمی
$Hj = jdate('H:i'); //ساعت در روز - ۲۴ساعته -
$user3 = bot_data_get_json("shop-factor.json");
$user3['factor']["$factor"]['fromid'] = $frmid;
$user3['factor']["$factor"]['coin'] = $am;
$user3['factor']["$factor"]['amount'] = $amount;
$user3['factor']["$factor"]['type'] = $type;
$user3['factor']["$factor"]['time'] = "📆 $lj $dj $Fj ۱۴$yj ⏰ $Hj";
saveJson("shop-factor.json",$user3);
if(function_exists('bot_payment_event_log_append')){
    bot_payment_event_log_append([
        'source'=>'legacy_gateway',
        'id'=>'factor_'.$factor,
        'factor'=>(string)$factor,
        'user_id'=>(string)$frmid,
        'amount'=>(int)$amount,
        'reward_amount'=>(int)$am,
        'item'=>(string)$am.' '.$money,
        'type'=>(string)$type,
        'status'=>'paid',
        'paid_at'=>time(),
        'created_at'=>time(),
        'raw_factor'=>$user3['factor']["$factor"] ?? [],
    ]);
}
}
//##########################################################
if($type == "cucrobot-membergir-panel"){
$jtime = date("Y/m/d | H:i:s");
if ($panel == 1) $caller = 'حرفه ای';
if ($panel == 2) $caller = 'ویژه';
$user2['type-panel'] = "$caller";
$user2['days'] = "$daypanel";
$user2['factor'][] = "$factor";
saveJson("melat/$frmid.json",$user2);
$dsepds = $shops + $amount; 
Save("lib/Button/shops.txt",$dsepds);
SM($frmid,"✅ پرداخت موفق
$icmoney پرداخت شما به مبلغ $hurice ریال برای پنل $caller پرداخت شد.

💠 پنل جدید شما: $caller معادل $daypanel روز
⏱ زمان پرداخت: $jtime",'html');
if(function_exists('bot_notify_configured_admins')){
    bot_notify_configured_admins("#خرید_موفق
💡> پنل $caller معادل $daypanel روز توسط کاربر $frmid خریداری شد !
💡> مبلغ $hurice ریال در حساب فروش شما ثبت شد !

جهت تسویه به پنل مدیریت ربات مراجعه کنید!", 'html', null, [$admin]);
}else{
    SM($admin,"#خرید_موفق
💡> پنل $caller معادل $daypanel روز توسط کاربر $frmid خریداری شد !
💡> مبلغ $hurice ریال در حساب فروش شما ثبت شد !

جهت تسویه به پنل مدیریت ربات مراجعه کنید!",'html');
}
$lj = jdate('l'); //نام روز در هفته - کامل
$Fj = jdate('F'); //نام ماه از سال - کامل
$dj = jdate('d'); //شماره ی روز از ماه - ۲ رقمی
$yj = jdate('y'); //سال (به عدد) دو رقمی
$Hj = jdate('H:i'); //ساعت در روز - ۲۴ساعته -
$user3 = bot_data_get_json("shop-factor.json");
$user3['factor']["$factor"]['fromid'] = $frmid;
$user3['factor']["$factor"]['panel'] = "$caller-$daypanel";
$user3['factor']["$factor"]['amount'] = $amount;
$user3['factor']["$factor"]['type'] = $type;
$user3['factor']["$factor"]['time'] = "📆 $lj $dj $Fj ۱۴$yj ⏰ $Hj";
saveJson("shop-factor.json",$user3);
if(function_exists('bot_payment_event_log_append')){
    bot_payment_event_log_append([
        'source'=>'legacy_gateway',
        'id'=>'factor_'.$factor,
        'factor'=>(string)$factor,
        'user_id'=>(string)$frmid,
        'amount'=>(int)$amount,
        'reward_amount'=>0,
        'item'=>'پنل '.$caller.' '.$daypanel.' روزه',
        'panel'=>(string)$caller,
        'panel_days'=>(string)$daypanel,
        'type'=>(string)$type,
        'status'=>'paid',
        'paid_at'=>time(),
        'created_at'=>time(),
        'raw_factor'=>$user3['factor']["$factor"] ?? [],
    ]);
}
}}else{
SM($chatID,"فاکتور با شماره $factor منقضی شده است",'html');
}}
//##########################################################
if($databot['power']=='خاموش' && !$isAdmin){
if($databot['power-text']=='✅فعال'){
bot('sendMessage',['chat_id'=>$chatID,'text'=>"{$databot['powertext']}",'parse_mode'=>'HTML']);
}exit();}
//################# هندل فوری تغییر نام دکمه‌ها #################
// این بخش عمداً قبل از /start و قبل از سایر شرط‌ها اجرا می‌شود تا پیام نام جدید
// توسط هیچ handler دیگری خورده نشود و ربات هنگام تغییر دکمه ساکت نماند.
if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($data) && preg_match('/^sets-([A-Za-z0-9_]+)$/', (string)$data, $m_button_quick)){
    $dok = $m_button_quick[1];
    $allowedButtonKeys = ['dok1','dok2','dok3','dok4','dok5','dok6','dok7','dok8','dok9','dok0','dok11','dokc1','dokc2','dokc3','dokc4'];
    if(!in_array($dok, $allowedButtonKeys, true)){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'❌ دکمه نامعتبر است', 'show_alert'=>true]);
        exit;
    }
    $currentButtonName = bot_data_get_text("lib/Button/$dok.txt", '');
    if($currentButtonName === '' && isset($$dok)) $currentButtonName = $$dok;
    $user['step'] = "sete-$dok";
    saveJson("melat/$userID.json", $user);
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'نام جدید را ارسال کنید', 'show_alert'=>false]);
    SM($chatID, "✏️ نام جدید دکمه را ارسال کنید.\n\nنام فعلی: $currentButtonName\n\nبرای لغو، /start را بزنید.", 'html', null, $Button_back_panel);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($data) && preg_match('/^uyfuyfuyyf$/', (string)$data)){
    $user['step'] = 'uyfuyfuyyf';
    saveJson("melat/$userID.json", $user);
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'واحد جدید را ارسال کنید', 'show_alert'=>false]);
    SM($chatID, "✅ واحد سفارش ربات را ارسال نمایید.\nمثلاً: الماس", 'html', null, $Button_back_panel);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($data) && preg_match('/^tdxytdciyt$/', (string)$data)){
    $user['step'] = 'tdxytdciyt';
    saveJson("melat/$userID.json", $user);
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'آیکون جدید را ارسال کنید', 'show_alert'=>false]);
    SM($chatID, "✅ آیکون واحد سفارش را ارسال نمایید.\nمثلاً: 💎", 'html', null, $Button_back_panel);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($message) && isset($step) && preg_match('/^sete-([A-Za-z0-9_]+)$/', (string)$step, $m_button_step_quick)){
    $doke = $m_button_step_quick[1];
    $newButtonName = trim((string)$msg);
    $allowedButtonKeys = ['dok1','dok2','dok3','dok4','dok5','dok6','dok7','dok8','dok9','dok0','dok11','dokc1','dokc2','dokc3','dokc4'];
    if($newButtonName === ''){
        SM($chatID, "❌ نام دکمه خالی است. دوباره نام جدید را ارسال کنید.", 'html', null, $Button_back_panel);
        exit;
    }
    if(!in_array($doke, $allowedButtonKeys, true)){
        $user['step'] = 'none';
        saveJson("melat/$userID.json", $user);
        SM($chatID, "❌ کلید دکمه نامعتبر است: $doke", 'html', null, $Button_Panel);
        exit;
    }
    Save("lib/Button/$doke.txt", $newButtonName);
    if(function_exists('bot_seed_button_defaults')) bot_seed_button_defaults(true);
    $user['step'] = 'none';
    saveJson("melat/$userID.json", $user);
    SM($chatID, "✅ نام دکمه با موفقیت تغییر کرد.\n\nدکمه جدید: $newButtonName\n\nبرای مشاهده تغییرات /start را بزنید.", 'html', null, $Button_Panel);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($message) && isset($step) && preg_match('/^uyfuyfuyyf$/', (string)$step)){
    $newUnit = trim((string)$msg);
    if($newUnit === ''){
        SM($chatID, "❌ متن واحد سفارش خالی است. دوباره ارسال کنید.", 'html', null, $Button_back_panel);
        exit;
    }
    Save("lib/Button/money.txt", $newUnit);
    if(function_exists('bot_seed_button_defaults')) bot_seed_button_defaults(true);
    $user['step'] = 'none';
    saveJson("melat/$userID.json", $user);
    SM($chatID, "✅ واحد سفارش با موفقیت تغییر کرد.\n\nبرای مشاهده تغییرات /start را بزنید.", 'html', null, $Button_Panel);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($message) && isset($step) && preg_match('/^tdxytdciyt$/', (string)$step)){
    $newIcon = trim((string)$msg);
    if($newIcon === ''){
        SM($chatID, "❌ آیکون خالی است. دوباره ارسال کنید.", 'html', null, $Button_back_panel);
        exit;
    }
    Save("lib/Button/icmoney.txt", $newIcon);
    if(function_exists('bot_seed_button_defaults')) bot_seed_button_defaults(true);
    $user['step'] = 'none';
    saveJson("melat/$userID.json", $user);
    SM($chatID, "✅ آیکون سفارش با موفقیت تغییر کرد.\n\nبرای مشاهده تغییرات /start را بزنید.", 'html', null, $Button_Panel);
    exit;
}
//###############################################################
//################ هندل فوری تنظیمات سفارش ممبر ادمین #################
// این بخش قبل از /start اجرا می‌شود تا مقدارهایی مثل نام، هزینه و تعداد عضو توسط handlerهای دیگر خورده نشوند.
if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($msg) && trim((string)$msg) === '📌ثبت سفارش'){
    $user['step'] = 'none';
    saveJson("melat/$userID.json", $user);
    bot_show_member_order_admin_panel($chatID);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($data) && preg_match('/^dpo_(.+)$/', (string)$data, $m_order_dpo_quick)){
    $key = $m_order_dpo_quick[1];
    $math = bot_data_get_json("lib/kodam/data-ads.json");
    if(!is_array($math)) $math = [];
    $current = isset($math[$key]) ? (string)$math[$key] : '❌غیر فعال';
    if($current === '✅فعال') $next = '❌غیر فعال';
    elseif($current === '❌غیر فعال') $next = '✅فعال';
    elseif($current === 'عکس دار') $next = 'متنی';
    elseif($current === 'متنی') $next = 'عکس دار';
    else $next = '✅فعال';
    $math[$key] = $next;
    saveJson("lib/kodam/data-ads.json", $math);
    $data_ads = $math;
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'تنظیم شد: '.$next, 'show_alert'=>false]);
    bot_show_member_order_admin_panel($chatID, $msg_id);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($data) && (string)$data === 'backaytemads'){
    $user['step'] = 'none';
    saveJson("melat/$userID.json", $user);
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'برگشت', 'show_alert'=>false]);
    bot_show_member_order_admin_panel($chatID, $msg_id);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($data) && preg_match('/^(aytem_ads|coin_ads|member_ads|coin_left|ksr_left|afz_left)-(.+)$/', (string)$data, $m_order_set_quick)){
    $type = $m_order_set_quick[1];
    $key = $m_order_set_quick[2];
    $user['step'] = $type.'-'.$key;
    saveJson("melat/$userID.json", $user);
    $texts = [
        'aytem_ads' => "✅ نام آیتم مورد نظر را ارسال کنید

نمونه: 👤 سفارش ۲۵ ممبر",
        'coin_ads' => "✅ هزینه این آیتم را فقط به صورت عدد ارسال کنید

نمونه صحیح: 100
نمونه فارسی هم قبول است: ۱۰۰",
        'member_ads' => "✅ تعداد ممبر درخواستی این آیتم را فقط به صورت عدد ارسال کنید

نمونه صحیح: 100
نمونه فارسی هم قبول است: ۱۰۰",
        'coin_left' => "✅ مدت زمانی که کاربران مجاز به ترک کانال نیستند را فقط به صورت عدد روز ارسال کنید

نمونه: 2",
        'ksr_left' => "✅ تعداد کسر در ازای ترک کانال را فقط عددی ارسال کنید

نمونه: 2",
        'afz_left' => "✅ تعداد برگشتی به سفارش‌دهنده در ازای ترک کانال را فقط عددی ارسال کنید

نمونه: 2",
    ];
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'مقدار را ارسال کنید', 'show_alert'=>false]);
    bot('sendMessage', [
        'chat_id'=>$chatID,
        'text'=>$texts[$type],
        'parse_mode'=>'HTML',
        'reply_markup'=>json_encode(['inline_keyboard'=>[[['text'=>'➡️ بازگشت','callback_data'=>'backaytemads']]]], JSON_UNESCAPED_UNICODE)
    ]);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($message) && isset($step) && preg_match('/^(aytem_ads|coin_ads|member_ads|coin_left|ksr_left|afz_left)-(.+)$/', (string)$step, $m_order_step_quick)){
    $type = $m_order_step_quick[1];
    $key = $m_order_step_quick[2];
    $valueRaw = trim((string)$msg);
    if($valueRaw === ''){
        SM($chatID, '❌ مقدار خالی است. دوباره ارسال کنید.', 'html', null, $Button_back_panel);
        exit;
    }
    if($type === 'aytem_ads'){
        Save("lib/Button/$key.txt", $valueRaw);
        $success = '✅ نام آیتم با موفقیت تنظیم شد.';
    }else{
        $value = bot_normalize_number_digits($valueRaw);
        if(!preg_match('/^\d+$/', $value) || (int)$value <= 0){
            SM($chatID, '❌ مقدار باید عددی و بزرگ‌تر از صفر باشد. مثال: 100', 'html', null, $Button_back_panel);
            exit;
        }
        if(in_array($type, ['coin_ads','member_ads'], true)){
            Save("lib/Button/$key.txt", $value);
            $success = $type === 'coin_ads' ? '✅ هزینه آیتم با موفقیت تنظیم شد.' : '✅ تعداد ممبر آیتم با موفقیت تنظیم شد.';
        }else{
            $data_left = bot_data_get_json("lib/kodam/data-left.json");
            if(!is_array($data_left)) $data_left = [];
            $data_left[$key] = $value;
            saveJson("lib/kodam/data-left.json", $data_left);
            $success = '✅ تنظیمات ترک کانال با موفقیت ثبت شد.';
        }
    }
    if(function_exists('bot_seed_button_defaults')) bot_seed_button_defaults(true);
    $user['step'] = 'none';
    saveJson("melat/$userID.json", $user);
    bot('sendMessage', [
        'chat_id'=>$chatID,
        'text'=>$success."

پنل تنظیم سفارش به‌روزرسانی شد:",
        'parse_mode'=>'HTML'
    ]);
    bot_show_member_order_admin_panel($chatID);
    exit;
}

//##################هندل فوری برگشت منو و منوی کاربر ادمین##########################
// این بخش قبل از /start اجرا می‌شود تا دکمه‌های برگشت توسط هیچ handler دیگری دوباره پردازش نشوند.
if(isset($Tc) && $Tc == 'private' && isset($msg) && $isAdmin && trim((string)$msg) === '🧾 بکاپ تنظیمات'){
    if(function_exists('bot_is_master_admin') ? !bot_is_master_admin($userID) : ((string)$userID !== (string)$admin)){
        SM($chatID, '🔒 بکاپ تنظیمات فقط برای ادمین اصلی باز است.', 'html', $msg_id, $Button_back_panel);
        exit;
    }
    if(!function_exists('bot_settings_backup_create_file')){
        SM($chatID, '❌ سرویس بکاپ تنظیمات در سورس پیدا نشد.', 'html', $msg_id, $Button_back_panel);
        exit;
    }
    $r = bot_settings_backup_create_file('bot_panel');
    if(empty($r['ok'])){
        SM($chatID, '❌ ساخت بکاپ تنظیمات انجام نشد.', 'html', $msg_id, $Button_back_panel);
        exit;
    }
    if(function_exists('bot_admin_tools_send_file')){
        bot_admin_tools_send_file($chatID, $r['file'], '🧾 بکاپ تنظیمات پنل | فرمت JSON');
        SM($chatID, "✅ <b>بکاپ تنظیمات پنل ساخته و به صورت فایل JSON ارسال شد.</b>\n\nبرای بازگردانی، دکمه <b>📥 ورود بکاپ</b> را بزن و همین فایل JSON را ارسال کن.", 'html', $msg_id, $Button_back_panel);
    }else{
        $link = function_exists('bot_admin_tools_backup_link') ? bot_admin_tools_backup_link($r['file']) : '';
        if($link !== ''){
            bot('sendMessage', [
                'chat_id'=>$chatID,
                'text'=>"✅ <b>بکاپ تنظیمات پنل ساخته شد.</b>\n\nاگر ارسال مستقیم فایل روی هاست فعال نبود، از لینک زیر دانلود کن.",
                'parse_mode'=>'HTML',
                'reply_to_message_id'=>$msg_id,
                'reply_markup'=>json_encode(['inline_keyboard'=>[
                    [['text'=>'⬇️ دانلود بکاپ تنظیمات JSON', 'url'=>$link]],
                ]], JSON_UNESCAPED_UNICODE)
            ]);
        }else{
            SM($chatID, '✅ بکاپ تنظیمات ساخته شد، اما ارسال فایل/لینک دانلود ساخته نشد. از پنل وب بخش بکاپ دانلودش کن.', 'html', $msg_id, $Button_back_panel);
        }
    }
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && isset($data) && preg_match('/^dbres_(yes|no):([a-f0-9]{16,32})$/', (string)$data, $mres)){
    if(function_exists('bot_is_master_admin') ? !bot_is_master_admin($userID) : ((string)$userID !== (string)$admin)){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'فقط ادمین اصلی اجازه دارد.', 'show_alert'=>true]);
        exit;
    }
    if(!function_exists('bot_admin_tools_pending_db_restore_map')){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'سرویس ریستور دیتابیس پیدا نشد.', 'show_alert'=>true]);
        exit;
    }
    $map = bot_admin_tools_pending_db_restore_map();
    $token = $mres[2];
    if(empty($map[$token]) || !is_array($map[$token])){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'درخواست ریستور منقضی شده یا پیدا نشد.', 'show_alert'=>true]);
        exit;
    }
    $pending = $map[$token];
    if($mres[1] === 'no'){
        if(!empty($pending['file'])) @unlink($pending['file']);
        unset($map[$token]); bot_admin_tools_pending_db_restore_map($map);
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'لغو شد.', 'show_alert'=>false]);
        bot('editmessagetext', ['chat_id'=>$chatID, 'message_id'=>$msg_id, 'text'=>'❌ بازگردانی دیتابیس لغو شد.', 'parse_mode'=>'HTML']);
        exit;
    }
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'در حال بازگردانی دیتابیس...', 'show_alert'=>false]);
    $file = (string)($pending['file'] ?? '');
    unset($map[$token]); bot_admin_tools_pending_db_restore_map($map);
    $r = function_exists('bot_admin_tools_restore_database_file') ? bot_admin_tools_restore_database_file($file, $userID) : ['ok'=>false,'error'=>'restore_service_missing'];
    @unlink($file);
    if(!empty($r['ok'])){
        bot('editmessagetext', [
            'chat_id'=>$chatID,
            'message_id'=>$msg_id,
            'text'=>'✅ <b>دیتابیس با موفقیت بازگردانی شد.</b>\n\nتعداد دستورهای اجراشده: <code>'.(int)($r['statements'] ?? 0).'</code>\nقبل از ریستور، یک بکاپ اضطراری هم ساخته شد.',
            'parse_mode'=>'HTML'
        ]);
    }else{
        bot('editmessagetext', [
            'chat_id'=>$chatID,
            'message_id'=>$msg_id,
            'text'=>'❌ <b>ریستور دیتابیس انجام نشد.</b>\n\nخطا: <code>'.htmlspecialchars((string)($r['error'] ?? 'نامشخص'), ENT_QUOTES, 'UTF-8').'</code>\nاگر بکاپ اضطراری ساخته شده باشد، داخل cache/backups قرار دارد.',
            'parse_mode'=>'HTML'
        ]);
    }
    exit;
}

if(isset($Tc) && $Tc == 'private' && isset($msg) && $isAdmin && trim((string)$msg) === '📥 ورود بکاپ'){
    if(function_exists('bot_is_master_admin') ? !bot_is_master_admin($userID) : ((string)$userID !== (string)$admin)){
        SM($chatID, '🔒 ورود بکاپ فقط برای ادمین اصلی باز است.', 'html', $msg_id, $Button_back_panel);
        exit;
    }
    $user['step'] = 'admin_restore_backup_wait_file';
    saveJson("melat/$userID.json", $user);
    SM($chatID, "📥 <b>ورود بکاپ از داخل ربات</b>\n\nفایل بکاپ را ارسال کن:\n• بکاپ تنظیمات: <code>.json</code>\n• بکاپ دیتابیس: <code>.sql</code> یا <code>.sql.gz</code>\n\nفایل PHP و فایل‌های config برای امنیت قبول نمی‌شوند.", 'html', $msg_id, $Button_back_panel);
    exit;
}

if(isset($Tc) && $Tc == 'private' && $isAdmin && (string)($user['step'] ?? '') === 'admin_restore_backup_wait_file'){
    if(function_exists('bot_is_master_admin') ? !bot_is_master_admin($userID) : ((string)$userID !== (string)$admin)){
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, '🔒 این عملیات فقط برای ادمین اصلی مجاز است.', 'html', $msg_id, $Button_back_panel);
        exit;
    }
    if(isset($msg) && bot_is_menu_back_text($msg)){
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        SM($chatID, '✅ عملیات ورود بکاپ لغو شد.', 'html', $msg_id, $Button_Panel);
        exit;
    }
    if(!isset($message->document) || empty($message->document->file_id)){
        SM($chatID, '❌ لطفاً فایل بکاپ را به صورت Document ارسال کن. فرمت‌های مجاز: json، sql، sql.gz', 'html', $msg_id, $Button_back_panel);
        exit;
    }
    $doc = $message->document;
    $origName = isset($doc->file_name) ? (string)$doc->file_name : 'backup_file';
    $safeName = preg_replace('/[^A-Za-z0-9._-]+/', '_', $origName);
    if($safeName === '' || $safeName === '_' || strpos($safeName, '.') === false) $safeName = 'backup_file';
    $lower = strtolower($safeName);
    if(preg_match('/\.php[0-9]?$/', $lower) || preg_match('/config(_db)?\.php$/', $lower)){
        SM($chatID, '❌ این فایل برای امنیت رد شد. فایل بکاپ نباید PHP یا config باشد.', 'html', $msg_id, $Button_back_panel);
        exit;
    }
    $isSettings = preg_match('/\.json$/i', $safeName);
    $isDb = preg_match('/\.sql$/i', $safeName) || preg_match('/\.sql\.gz$/i', $safeName);
    if(!$isSettings && !$isDb){
        SM($chatID, '❌ فرمت فایل معتبر نیست. فقط .json برای تنظیمات و .sql یا .sql.gz برای دیتابیس مجاز است.', 'html', $msg_id, $Button_back_panel);
        exit;
    }
    $dir = 'cache/backups/imports'; if(!is_dir($dir)) @mkdir($dir, 0775, true);
    $target = $dir.'/import_'.date('Ymd_His').'_'.substr(bin2hex(random_bytes(4)),0,8).'_'.$safeName;
    $dl = function_exists('bot_admin_tools_download_telegram_file') ? bot_admin_tools_download_telegram_file((string)$doc->file_id, $target) : ['ok'=>false,'error'=>'download_service_missing'];
    if(empty($dl['ok'])){
        SM($chatID, '❌ دانلود فایل از تلگرام انجام نشد: '.htmlspecialchars((string)($dl['error'] ?? 'نامشخص'), ENT_QUOTES, 'UTF-8'), 'html', $msg_id, $Button_back_panel);
        exit;
    }
    if($isSettings){
        $raw = (string)@file_get_contents($target);
        @unlink($target);
        $json = json_decode($raw, true);
        if(!is_array($json)){
            SM($chatID, '❌ فایل JSON معتبر نیست یا خراب است.', 'html', $msg_id, $Button_back_panel);
            exit;
        }
        $r = function_exists('bot_settings_backup_restore_array') ? bot_settings_backup_restore_array($json, $userID) : ['ok'=>false,'error'=>'restore_service_missing'];
        $user['step']='none'; saveJson("melat/$userID.json", $user);
        if(!empty($r['ok'])){
            SM($chatID, '✅ تنظیمات با موفقیت وارد شد.\n\nآیتم‌های اعمال‌شده: <code>'.(int)($r['restored'] ?? 0).'</code>\nآیتم‌های ردشده: <code>'.(int)($r['skipped'] ?? 0).'</code>', 'html', $msg_id, $Button_Panel);
        }else{
            $err = (string)($r['error'] ?? '');
            if($err === '' && !empty($r['errors']) && is_array($r['errors'])) $err = implode(' | ', array_slice($r['errors'], 0, 5));
            SM($chatID, '⚠️ بازگردانی تنظیمات کامل نبود.\n\nاعمال‌شده: <code>'.(int)($r['restored'] ?? 0).'</code>\nردشده: <code>'.(int)($r['skipped'] ?? 0).'</code>\nخطا: <code>'.htmlspecialchars($err ?: 'نامشخص', ENT_QUOTES, 'UTF-8').'</code>', 'html', $msg_id, $Button_Panel);
        }
        exit;
    }
    $user['step']='none'; saveJson("melat/$userID.json", $user);
    $token = function_exists('bot_admin_tools_stage_db_restore') ? bot_admin_tools_stage_db_restore($target, $userID) : '';
    if($token === ''){
        @unlink($target);
        SM($chatID, '❌ سرویس آماده‌سازی ریستور دیتابیس پیدا نشد.', 'html', $msg_id, $Button_Panel);
        exit;
    }
    bot('sendMessage', [
        'chat_id'=>$chatID,
        'text'=>"⚠️ <b>تأیید بازگردانی دیتابیس</b>\n\nفایل دریافت شد: <code>".htmlspecialchars($safeName, ENT_QUOTES, 'UTF-8')."</code>\nحجم: <code>".number_format((int)($dl['size'] ?? 0))." بایت</code>\n\nبا تأیید، دیتابیس فعلی با محتوای این فایل جایگزین/بروزرسانی می‌شود. قبل از اجرا، ربات یک بکاپ اضطراری از دیتابیس فعلی می‌سازد.",
        'parse_mode'=>'HTML',
        'reply_to_message_id'=>$msg_id,
        'reply_markup'=>json_encode(['inline_keyboard'=>[
            [['text'=>'✅ تأیید ریستور دیتابیس', 'callback_data'=>'dbres_yes:'.$token]],
            [['text'=>'❌ لغو', 'callback_data'=>'dbres_no:'.$token]],
        ]], JSON_UNESCAPED_UNICODE)
    ]);
    exit;
}
if(isset($Tc) && $Tc == 'private' && isset($msg) && $isAdmin && function_exists('bot_is_web_panel_button_text') && bot_is_web_panel_button_text($msg)){
    $webPanelUrl = function_exists('bot_web_panel_url') ? bot_web_panel_url() : '';
    if($webPanelUrl === ''){
        SM($chatID, '❌ آدرس پنل وب پیدا نشد. مقدار BOT_PUBLIC_BASE_URL را در config.php بررسی کن.', 'html', $msg_id, $Button_back_panel);
    }else{
        bot('sendMessage', [
            'chat_id'=>$chatID,
            'text'=>"🌐 <b>پنل وب مدیریت</b>

برای ورود به پنل وب روی دکمه زیر بزن. اگر وارد نشدی، با آیدی عددی ادمین و رمز پنل وب لاگین کن.",
            'parse_mode'=>'HTML',
            'reply_to_message_id'=>$msg_id,
            'reply_markup'=>json_encode(['inline_keyboard'=>[
                [['text'=>'🌐 ورود به پنل وب', 'url'=>$webPanelUrl]],
            ]], JSON_UNESCAPED_UNICODE)
        ]);
    }
    exit;
}
if(isset($Tc) && $Tc == 'private' && isset($msg) && bot_is_admin_user_menu_text($msg) && $isAdmin){
    bot_show_user_main_menu_for_admin($chatID, $user, $userID);
    exit;
}
if(isset($Tc) && $Tc == 'private' && isset($msg) && bot_is_admin_menu_back_text($msg) && $isAdmin){
    bot_show_admin_main_menu($chatID, $user, $userID, '👤 پنل مدیریت');
    exit;
}
if(isset($Tc) && $Tc == 'private' && isset($msg) && bot_is_menu_back_text($msg)){
    if($isAdmin){
        bot_show_admin_main_menu($chatID, $user, $userID, '👤 پنل مدیریت');
    }else{
        bot_show_user_main_menu($chatID, $user, $userID);
    }
    exit;
}


// اگر کاربر جدید فقط /start زده و قفل جوین فعال است، فایل کاربر را با هدیه در انتظار بسازیم.
if(!$isAdmin && isset($Tc) && $Tc == 'private' && !empty($forcedJoinMissingChannels) && isset($msg) && preg_match('/^\/start(\s+.*)?$/', trim((string)$msg)) && !bot_data_file_exists("melat/$userID.json")){
    $newUser = function_exists('bot_referral_create_default_user') ? bot_referral_create_default_user($userID, null) : $user;
    if(function_exists('bot_fraud_prepare_new_user_for_start_gift')) $newUser = bot_fraud_prepare_new_user_for_start_gift($newUser, $userID);
    if(function_exists('saveJson')) saveJson("melat/$userID.json", $newUser);
    elseif(function_exists('bot_data_put_json')) bot_data_put_json("melat/$userID.json", $newUser);
    $user = array_merge($user, $newUser);
}


function bot_forced_join_fresh_home_keyboard($isAdmin = false, $Button_Home = null, $Button_Admin = null){
    // بعد از تایید عضویت باید کیبورد از نو ساخته شود؛ چون این بخش قبل از ساخت اولیه $Button_Home هم اجرا می‌شود.
    // اگر کیبورد از مقدار قدیمی/خالی استفاده کند، دکمه‌های جدید مثل اسپانسر/پشتیبانی یا چینش پنل به‌روز دیده نمی‌شوند.
    if(!$isAdmin){
        if(function_exists('bot_home_repair_core_buttons')) @bot_home_repair_core_buttons(false);
        if(function_exists('bot_home_build_reply_keyboard')){
            $fresh = bot_home_build_reply_keyboard(false);
            if(!empty($fresh)) return $fresh;
        }
    }
    if($isAdmin && !empty($Button_Admin)) return $Button_Admin;
    return $Button_Home;
}

function bot_forced_join_cleanup_inline_prompt($chatID, $msg_id = null){
    // پیام جوین اجباری قبلی را از حالت دکمه‌دار خارج می‌کنیم تا کاربر بعد از تایید، همان دکمه‌های قدیمی را نبیند.
    if(empty($chatID) || empty($msg_id)) return;
    @bot('editMessageText', [
        'chat_id'=>$chatID,
        'message_id'=>$msg_id,
        'text'=>'✅ عضویت شما تأیید شد.

منوی اصلی ربات برای شما به‌روز شد.',
        'parse_mode'=>'HTML'
    ]);
}

function bot_after_forced_join_send_start_screen($chatID, $userID, &$user, $isAdmin, $starttext, $Button_Home = null, $Button_Admin = null){
    if(function_exists('bot_start_join_ad_send') && !$isAdmin) bot_start_join_ad_send($chatID, $userID);
    if(is_array($user)) $user['step'] = 'none';
    if(function_exists('saveJson') && is_array($user)) @saveJson("melat/$userID.json", $user);
    $vars = function_exists('bot_text_settings_user_vars') ? bot_text_settings_user_vars() : [];
    $text = function_exists('bot_text_settings_apply_vars') ? bot_text_settings_apply_vars($starttext, $vars) : $starttext;
    $freshKeyboard = bot_forced_join_fresh_home_keyboard($isAdmin, $Button_Home, $Button_Admin);
    bot('sendMessage',[
        'chat_id'=>$chatID,
        'text'=>$text,
        'parse_mode'=>'HTML',
        'reply_markup'=>$freshKeyboard
    ]);
}

//################## جوین اجباری؛ بررسی دقیق دکمه عضو شدم #########################
if(!$isAdmin && isset($Tc) && $Tc == 'private' && !empty($forcedJoinMissingChannels)){
    if(isset($data) && (string)$data === 'forced_join_check' && !empty($data_id)){
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'هنوز عضویت کامل نشده. اول عضو کانال‌ها شو بعد دوباره بزن.', 'show_alert'=>true]);
    }
    bot_send_forced_join_message($chatID, $forcedJoinMissingChannels);
    exit();
}
if(!$isAdmin && isset($Tc) && $Tc == 'private' && empty($forcedJoinMissingChannels)){
    // هدیه استارت اگر در انتظار باشد، بعد از تکمیل جوین اجباری آزاد می‌شود.
    // پاداش زیرمجموعه فقط هنگام زدن دکمه «بررسی عضویت» داده می‌شود تا پرداخت ناخواسته روی هر پیام کاربر رخ ندهد.
    if(function_exists('bot_fraud_award_pending_start_gift')) bot_fraud_award_pending_start_gift($userID, true);
}
if(isset($data) && (string)$data === 'forced_join_check' && isset($Tc) && $Tc == 'private'){
    if(function_exists('bot_fraud_award_pending_start_gift')) bot_fraud_award_pending_start_gift($userID, true);
    $refVerifyResult = function_exists('bot_referral_verify_forced_join_and_reward') ? bot_referral_verify_forced_join_and_reward($userID, true, isset($forcedJoinChannels) && is_array($forcedJoinChannels) ? $forcedJoinChannels : []) : ['ok'=>false,'reason'=>'function_missing'];
    if(function_exists('bot_referral_verify_log')) bot_referral_verify_log($userID, '', $refVerifyResult, ['source'=>'forced_join_check_callback']);
    if(!empty($data_id)) bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'عضویت تایید شد؛ شروع ربات برای شما نمایش داده شد.', 'show_alert'=>false]);
    if(function_exists('bot_forced_join_cleanup_inline_prompt')) bot_forced_join_cleanup_inline_prompt($chatID, $msg_id ?? null);
    bot_after_forced_join_send_start_screen($chatID, $userID, $user, $isAdmin, $starttext, $Button_Home, $Button_Admin ?? null);
    exit();
}

//################استارت ربات#################################
if($msg == '/start' and $Tc == 'private'){
bot('sendMessage',[
'chat_id'=>$chatID,
'text'=>function_exists('bot_text_settings_apply_vars') ? bot_text_settings_apply_vars($starttext, bot_text_settings_user_vars()) : $starttext,
'parse_mode'=>'HTML',
'reply_to_message_id'=>$msg_id,
'reply_markup'=>$Button_Home
]);
if(!bot_data_file_exists("melat/$userID.json")){
$user["step"] = "none";
$user["date-start"] = "$date";
$user["zirmjmae"] = "0";
$user["type-panel"] = 'عادی';
$user['time-panel'] = '0';
$user["Points"] = (string)(function_exists('bot_join_gift_amount') ? bot_join_gift_amount() : 10);
$user["warn"] = "0";
$user["ads"] = "0";
$user['enteghal_as'] = 0;
$user['ENTEQALAT'] = null;
$user['enteghal_to'] = 0;
$user["send-coin-admin"] = "0";
$user["sefaresh"] = "0";
$user["sub"] = null;
$user["zirmjmae-porsant"] = "0";
$user["zirmjmae-join"] = "0";
$user['time-day'] = "0";
}else{
$user['step'] = 'none';
}
saveJson("melat/$userID.json",$user);
if(!$isAdmin && !empty($forcedJoinChannels) && function_exists('bot_start_join_ad_send')) bot_start_join_ad_send($chatID, $userID);
}
//###############استارت زیرمجموعه###############################
// مسیر قدیمی اینجا بلافاصله بعد از /start ref پیام «زیرمجموعه جدید» می‌فرستاد و پاداش را قبل از بررسی عضویت می‌داد.
// از این نسخه هیچ پاداشی در این بلوک پرداخت نمی‌شود؛ فقط رفرال ثبت می‌شود و پرداخت فقط بعد از دکمه «بررسی عضویت» انجام می‌شود.
else if(strpos($msg , '/start ') !== false and $Tc == 'private'){
    $payload = trim((string)substr((string)$msg, 7));
    if($payload !== '' && (strpos($payload,"-100") !== false || strpos($payload,'@') !== false)){
        exit();
    }
    bot('sendMessage',[
        'chat_id'=>$chatID,
        'text'=>function_exists('bot_text_settings_apply_vars') ? bot_text_settings_apply_vars($starttext, bot_text_settings_user_vars()) : $starttext,
        'parse_mode'=>'HTML',
        'reply_to_message_id'=>$msg_id,
        'reply_markup'=>$Button_Home
    ]);

    $registeredByRef = false;
    if($payload !== '' && function_exists('bot_referral_register_start_payload')){
        $currentUser = function_exists('bot_data_get_json') ? bot_data_get_json("melat/$userID.json", []) : [];
        if(!is_array($currentUser)) $currentUser = [];
        $reg = bot_referral_register_start_payload($userID, $payload, $currentUser, true);
        $registeredByRef = is_array($reg) && !empty($reg['ok']);
    }

    if(!$registeredByRef && !bot_data_file_exists("melat/$userID.json")){
        $newUser = function_exists('bot_referral_create_default_user') ? bot_referral_create_default_user($userID, null) : $user;
        if(function_exists('bot_fraud_prepare_new_user_for_start_gift')) $newUser = bot_fraud_prepare_new_user_for_start_gift($newUser, $userID);
        if(function_exists('saveJson')) saveJson("melat/$userID.json", $newUser);
        elseif(function_exists('bot_data_put_json')) bot_data_put_json("melat/$userID.json", $newUser);
        $user = array_merge($user, $newUser);
    }else{
        $loadedUser = function_exists('bot_data_get_json') ? bot_data_get_json("melat/$userID.json", []) : [];
        if(is_array($loadedUser) && !empty($loadedUser)) $user = array_merge($user, $loadedUser);
    }

    // اگر هنوز قفل جوین کامل نشده باشد، کاربر فقط پیام جوین می‌گیرد.
    // پرداخت هدیه رفرال فقط در callback_data=forced_join_check انجام می‌شود.
    if(!$isAdmin && !empty($forcedJoinMissingChannels)){
        bot_send_forced_join_message($chatID, $forcedJoinMissingChannels);
        exit();
    }
}
//##################جویین اجباری با دکمه شیشه‌ای#########################
elseif($stats != 'creator' and $stats != 'administrator' and $stats != 'member' and $channel !== '' and !$isAdmin and $Tc == 'private'){
    $joinChannels = [$channel];
    if($stats2 != 'creator' and $stats2 != 'administrator' and $stats2 != 'member' and $channel2 !== '' and !$isAdmin and $Tc == 'private'){
        $joinChannels[] = $channel2;
    }
    bot_send_forced_join_message($chatID, $joinChannels);
    exit();
}
if($stats2 != 'creator' and $stats2 != 'administrator' and $stats2 != 'member' and $channel2 !== '' and !$isAdmin and $Tc == 'private'){
    bot_send_forced_join_message($chatID, [$channel2]);
    exit();
}
elseif($data == 'forced_join_check' and $Tc == 'private'){
    if(function_exists('bot_fraud_award_pending_start_gift')) bot_fraud_award_pending_start_gift($userID, true);
    $refVerifyResult = function_exists('bot_referral_verify_forced_join_and_reward') ? bot_referral_verify_forced_join_and_reward($userID, true, isset($forcedJoinChannels) && is_array($forcedJoinChannels) ? $forcedJoinChannels : []) : ['ok'=>false,'reason'=>'function_missing'];
    if(function_exists('bot_referral_verify_log')) bot_referral_verify_log($userID, '', $refVerifyResult, ['source'=>'forced_join_check_callback']);
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'عضویت تایید شد؛ شروع ربات برای شما نمایش داده شد.', 'show_alert'=>false]);
    if(function_exists('bot_forced_join_cleanup_inline_prompt')) bot_forced_join_cleanup_inline_prompt($chatID, $msg_id ?? null);
    bot_after_forced_join_send_start_screen($chatID, $userID, $user, $isAdmin, $starttext, $Button_Home, $Button_Admin ?? null);
    exit();
}
//##################بازگشت به منوی اصلی / منوی ادمین##########################
elseif((bot_is_menu_back_text($msg) || bot_is_admin_menu_back_text($msg)) and $Tc == 'private'){
    if($isAdmin){
        bot_show_admin_main_menu($chatID, $user, $userID, '👤 پنل مدیریت');
    }else{
        bot_show_user_main_menu($chatID, $user, $userID);
    }
    exit;
}
elseif($data == 'admin_main_menu' and $isAdmin){
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'پنل مدیریت', 'show_alert'=>false]);
    bot_show_admin_main_menu($chatID, $user, $userID, '👤 پنل مدیریت');
    exit;
}
//################پنل تنظیم آیتم‌های سفارش ممبر - مسیر امن ادمین##########################
elseif($msg == "📌ثبت سفارش" and $Tc == 'private' and $isAdmin){
    $user['step'] = 'none';
    saveJson("melat/$userID.json", $user);
    $data_ads = bot_data_get_json("lib/kodam/data-ads.json");
    $data_left = bot_data_get_json("lib/kodam/data-left.json");
    bot_show_member_order_admin_panel($chatID);
}
//################دریافت الماس رایگان##########################
elseif($msg == "$dok1" and $Tc == 'private'){
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
bot('sendMessage',[
'chat_id'=>$chatID,
'text'=>"$doktxt1",
'parse_mode'=>'HTML',
'reply_markup'=>json_encode([
'inline_keyboard' => [ 
[["text"=>"$dokday", 'callback_data'=>"dailygiftt"],["text" => "$dokchannel", 'url' => "https://t.me/$chads"]],
]])]);
}
//################الماس روزانه#############################
else if($data == "dailygiftt"){
$times = time();
if($times >= $timer){
$user['step'] = 'none';
//##########################
if($user['type-panel'] == 'عادی'){
bot('answercallbackquery', [
'callback_query_id' => $data_id,
'text' => "✅ تبریک!
👈 برای امروز به شما $mdailys1 $money هدیه تعلق گرفت
برای دریافت مجدد $money فردا مجدد امتحان کنید",
'show_alert' => true
]);
$mdailys = $Points + $mdailys1;}
if($user['type-panel'] == 'حرفه ای'){
bot('answercallbackquery', [
'callback_query_id' => $data_id,
'text' => "✅ تبریک!
👈 برای امروز به شما $mdailys2 $money هدیه تعلق گرفت
برای دریافت مجدد $money فردا مجدد امتحان کنید",
'show_alert' => true
]);
$mdailys = $Points + $mdailys2;}
if($user['type-panel'] == 'ویژه'){
bot('answercallbackquery', [
'callback_query_id' => $data_id,
'text' => "✅ تبریک!
👈 برای امروز به شما $mdailys3 $money هدیه تعلق گرفت
برای دریافت مجدد $money فردا مجدد امتحان کنید",
'show_alert' => true
]);
$mdailys = $Points + $mdailys3;}
//###########################
$user['Points'] = $mdailys;
$user['time-day'] = $times + 86400;
saveJson("melat/$userID.json",$user);
}else{
bot('answercallbackquery', [
'callback_query_id' => $data_id,
'text' => "
شما قبلا هدیه روزانه خود را دریافت کردید",
'show_alert' => false
]);
}}
//##############حساب کاربری######################################
elseif($msg == "$dok2" and $Tc == 'private'){
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
if(function_exists('bot_user_account_pro_text')){
    $userinfotext = bot_user_account_pro_text($userID, $user, ['money'=>$money, 'bot_username'=>$boter_id]);
}else{
    $userinfotext = "
🔰شماره کاربری : $userID
📆تاریخ عضویت : $dates
♻️نوع پنل : $panels
⌛️ اعتبار پنل : ".(($user['type-panel'] == 'عادی') ? 'نامحدود' : ($user['time-panel'].' روز'))."

⚠️اخطار : $warn از 3
✔️ تعداد سفارشات : $sefaresh تا
🔷 تعداد عضویت : $adss
🎁هدیه مدیریت : $coin_admin

💳 انتقالات 
📥دریافتی : $recivecoins
📤واریزی : $sentcoins

👥 زیر مجموعه ها
✔️ مجموع : $inv
✔️ تعداد عضویت : $invjoin
✔️ پورسانت دریافتی : $invcoin

✅ موجودی : $Points
";
}
bot('sendMessage',[
'chat_id'=>$chatID,
'text'=>"$userinfotext",
'parse_mode'=>"html",
'reply_to_message_id'=>$msg_id,
'reply_markup'=>json_encode([
'inline_keyboard'=>[
[['text' => "📋 کپی لینک دعوت", "copy_text"=>['text'=>"https://t.me/$boter_id?start=$chatID"]]],
[['text' => "📋 کپی کد کاربری", "copy_text"=>['text'=>(string)$chatID]]],
]], JSON_UNESCAPED_UNICODE)]); 
}
elseif($data == "my_user_code"){
    // سازگاری با پیام‌های قدیمی: دیگر پیام جدا ارسال نمی‌شود.
    bot('answercallbackquery', [
        'callback_query_id' => $data_id,
        'text' => "کد کاربری شما: $chatID",
        'show_alert' => true
    ]);
}

//###################اشتراک کد کاربری به صورت اینلاین###########################
elseif($shareing == "ShareCodeUser"){
$usershare = $update->inline_query->from->id;
bot("answerInlineQuery",[
"inline_query_id"=>$update->inline_query->id,
"results"=>json_encode([[
"type"=>"article",
"id"=>base64_encode(rand(5,555)),
"title"=>"اشتراک گذاری کد کاربری",
"input_message_content"=>["parse_mode"=>"html","message_text"=>"$usershare
کد کاربری من در ربات @$boter_id"],
]])]);
}
//#######################ثبت سفارش############################
else if($msg == "$dok3"  and $Tc == 'private'){
if($data_ads['Lock-sabtads']=='❌غیر فعال'){
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
$Button_MemOrder = bot_member_order_keyboard($orderkey);
bot('sendMessage',[
'chat_id'=>$chatID,
'text'=>"$doktxt3",
'parse_mode'=>'HTML',
'reply_to_message_id'=>$msg_id,
'reply_markup'=>$Button_MemOrder]);
}else{
bot('sendMessage', [
'chat_id' => $chatID,
'text'=>"✔️ثبت سفارش موقتا غیر فعال است",
]);
}}
//#####################زیرمجموعه گیری################################
elseif($msg=="$dok4" and $Tc == 'private'){
bot('sendMessage',[
'chat_id'=>$chatID,
'text'=>"$doktxt4",
'parse_mode'=>'HTML',
'reply_markup'=>json_encode([
 "resize_keyboard"=>true,'one_time_keyboard' => true,
'inline_keyboard' => [
[['text' => "📌دریافت بنر زیرمجموعه گیری", 'callback_data' => "banerzir"]],
]])]);
}
//######################دریافت بنر زیرمجموعه#########################
elseif($data == "banerzir"){
if($datazir["banerzir"] == '🖼عکس دار'){
if($piclink != null){
bot('sendphoto',[
 'chat_id'=>$chatID,
 'photo'=>$piclink,
 'caption'=>function_exists('bot_text_settings_referral_text') ? bot_text_settings_referral_text($zirtext, ['USER_ID'=>$chatID, 'ID'=>$chatID]) : "$zirtext\n\nhttps://t.me/$boter_id?start=$chatID",
 ]);
}else{
bot('sendMessage',['chat_id'=>$chatID,'text'=>"عکس این بخش باید از پنل مدیریت تنظیم شود",'parse_mode'=>"MarkDown",]);}}
if($datazir["banerzir"] == '📝متنی'){
bot('sendMessage',['chat_id'=>$chatID,'text'=>function_exists('bot_text_settings_referral_text') ? bot_text_settings_referral_text($zirtext, ['USER_ID'=>$chatID, 'ID'=>$chatID]) : "$zirtext\n\nhttps://t.me/$boter_id?start=$chatID",'parse_mode'=>"MarkDown",]);}}
//######################بانک انتقال حذف شده########################################
elseif(isset($msg) && trim((string)$msg) !== '' && trim((string)$dok5) !== '' && trim((string)$msg) === trim((string)$dok5) && $Tc == 'private'){
    bot_simplified_removed_transfer_reply($chatID, $user, $userID, $Button_Home);
    exit;
}
//#####################انتقال الماس حذف شده######################################
elseif(isset($msg) && bot_simplified_is_removed_transfer_text($msg, $money ?? 'الماس') && $Tc == 'private'){
    bot_simplified_removed_transfer_reply($chatID, $user, $userID, $Button_Home);
    exit;
}
elseif(isset($step) && preg_match('/^(sendcoin|transfer-)/', (string)$step) && $Tc == 'private'){
    bot_simplified_removed_transfer_reply($chatID, $user, $userID, $Button_Home);
    exit;
}
//###############بخش پیگیری####################################
elseif(($msg == "$dok6" || $msg == '🔍 پیگیری ها' || $msg == '🔍پیگیری ها' || $msg == '🔍 پیگیری سفارشات' || $msg == 'پیگیری سفارشات') and $Tc == 'private'){
bot('sendMessage',[
'chat_id'=>$chatID,
'text'=>"$doktxt6",
'parse_mode'=>"HTML",
'reply_to_message_id'=>$msg_id,
'reply_markup'=>json_encode([
'inline_keyboard'=>[
[['text'=>"$dokp1", 'callback_data'=> 'payorders']],
]])]);}
//#################برگشت به پیگیری سفارش##############################
elseif($data == "backpaybutton"){
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
if(function_exists('bale_show_orders_dashboard')){
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'پیگیری سفارشات', 'show_alert'=>false]);
    bale_show_orders_dashboard($chatID, $msg_id, $userID, $money);
}else{
    bot('editmessagetext', [
    'chat_id' => $chatID,
    'message_id' => $msg_id,
    'text'=>"👈️ گزینه مورد نظر را انتخاب نمائید.",
    'parse_mode'=>"HTML",
    'reply_markup'=>json_encode([
    'inline_keyboard'=>[
    [['text'=>"$dokp1", 'callback_data'=> 'payorders']],
    ]])]);
}
exit;}
//###################پیگیری سفارش############################
elseif($data == "payorders" || $data == "orders-refresh"){
$chatID = $update->callback_query->message->chat->id;
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
bale_show_orders_dashboard($chatID, $msg_id, $userID, $money);
exit;
}
//###################جزئیات سفارش############################
elseif(preg_match('/^orderdetail-(.*)/', $data, $match)){
$orderId = preg_replace('/[^A-Za-z0-9_\-]/', '', (string)$match[1]);
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
if($orderId === '' || !bot_data_file_exists("ads/$orderId.json")){
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'❌ سفارش یافت نشد', 'show_alert'=>true]);
    die();
}
$order = bot_data_get_json("ads/$orderId.json");
if(!is_array($order) || (string)($order['admin'] ?? '') !== (string)$userID){
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'❌ این سفارش متعلق به شما نیست', 'show_alert'=>true]);
    die();
}
$text = bale_order_card_text($orderId, $order, $money);
bot('editmessagetext', [
    'chat_id' => $chatID,
    'message_id' => $msg_id,
    'text' => $text,
    'parse_mode' => 'html',
    'reply_markup' => bale_order_detail_keyboard($orderId, $order, $data_Cancellads["Condition"] ?? '❌غیر فعال')
]);
}
//###################تأیید لغو سفارش از داشبورد############################
elseif(preg_match('/^cancelask-(.*)/', $data, $match)){
$orderId = function_exists('bot_order_cancel_clean_id') ? bot_order_cancel_clean_id($match[1]) : preg_replace('/[^A-Za-z0-9_\-]/', '', (string)$match[1]);
if(function_exists('bot_order_cancel_validate')){
    $res = bot_order_cancel_validate($orderId, $userID, false);
    if(empty($res['ok'])){
        $txt = function_exists('bot_order_cancel_error_text') ? bot_order_cancel_error_text($res, $money) : '❌ لغو سفارش امکان‌پذیر نیست.';
        bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'لغو سفارش امکان‌پذیر نیست', 'show_alert'=>false]);
        bot('editmessagetext', [
            'chat_id'=>$chatID,
            'message_id'=>$msg_id,
            'text'=>$txt,
            'parse_mode'=>'MarkDown',
            'reply_markup'=>json_encode(['inline_keyboard'=>[[['text'=>'📋 لیست سفارش‌ها','callback_data'=>'payorders']]]], JSON_UNESCAPED_UNICODE),
        ]);
        exit;
    }
    $order = $res['order'];
    $calc = $res['calc'];
    $refund = number_format((int)($calc['refund'] ?? 0));
    $remaining = (int)($calc['remaining'] ?? 0);
    $text = bale_order_card_text($orderId, $order, $money)."

⁉️ **لغو این سفارش را تأیید می‌کنید؟**
👥 باقی‌مانده قابل محاسبه: **{$remaining}**
💎 مبلغ بازگشتی تقریبی: **{$refund} {$money}**";
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'تأیید لغو سفارش', 'show_alert'=>false]);
    bot('editmessagetext', [
        'chat_id' => $chatID,
        'message_id' => $msg_id,
        'text' => $text,
        'parse_mode' => 'MarkDown',
        'reply_markup' => json_encode(['inline_keyboard'=>[
            [['text'=>'✅ تلگرام، لغو شود','callback_data'=>"cancell-$orderId"], ['text'=>'❌ خیر','callback_data'=>"orderdetail-$orderId"]],
            [['text'=>'📋 لیست سفارش‌ها','callback_data'=>'payorders']],
        ]], JSON_UNESCAPED_UNICODE)
    ]);
    exit;
}
if($data_Cancellads["Condition"] != '✅فعال'){
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'❌ لغو سفارش غیرفعال است', 'show_alert'=>true]);
    die();
}
if($orderId === '' || !bot_data_file_exists("ads/$orderId.json")){
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'❌ سفارش یافت نشد', 'show_alert'=>true]);
    die();
}
$order = bot_data_get_json("ads/$orderId.json");
if(!is_array($order) || (string)($order['admin'] ?? '') !== (string)$userID){
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'❌ این سفارش متعلق به شما نیست', 'show_alert'=>true]);
    die();
}
if(($order['stats'] ?? '') !== 'در حال اجرا ♻️'){
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'❌ این سفارش فعال نیست', 'show_alert'=>true]);
    die();
}
$text = bale_order_card_text($orderId, $order, $money)."

⁉️ **لغو این سفارش را تأیید می‌کنید؟**
⚠️ مقدار بازگشتی طبق ضریب تنظیم‌شده در پنل محاسبه می‌شود.";
bot('editmessagetext', [
    'chat_id' => $chatID,
    'message_id' => $msg_id,
    'text' => $text,
    'parse_mode' => 'html',
    'reply_markup' => json_encode(['inline_keyboard'=>[
        [['text'=>'✅ تلگرام، لغو شود','callback_data'=>"cancell-$orderId"], ['text'=>'❌ خیر','callback_data'=>"orderdetail-$orderId"]],
        [['text'=>'📋 لیست سفارش‌ها','callback_data'=>'payorders']],
    ]], JSON_UNESCAPED_UNICODE)
]);
}
//##########################################################################
elseif(strpos($msg,"/ord_") !== false  and $Tc == 'private'){
$id = str_replace("/ord_","",$msg);
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
send_order_post_to_user($chatID, $userID, $id, $Button_Home);
}
//##########################################################################
elseif(preg_match('/^vieworder-(.*)/', $data, $match)){
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
send_order_post_to_user($chatID, $userID, $match[1], $Button_Home);
}
//##########################################################################
elseif(strpos($msg,"/cancel_") !== false  and $Tc == 'private'){
if($data_Cancellads["Condition"] == '✅فعال'){
$id = str_replace("/cancel_","",$msg);
if(bot_data_file_exists("ads/$id.json")){
$order = bot_data_get_json("ads/$id.json");
if($userID == $order['admin']){
if($order['stats'] == 'در حال اجرا ♻️'){
$msgid = bot('ForwardMessage',[
'chat_id'=>$userID,
'from_chat_id'=>"@$chads",
'message_id'=>$order['postid'],
])->result->message_id;
$Buton_poin = json_encode(['inline_keyboard'=>[
[['text'=>"✅تلگرام",'callback_data'=>"cancell-$id"],['text'=>"❌خیر",'callback_data'=>'backpaybutton']],
]]);
SM($chatID,"⁉️آیا مایل به لغو این تبلیغ هستید؟

⚠️توجه داشته باشید با ضریب {$data_Cancellads["Coefficientadscoin"]} معادل بازدید های باقی مانده $money به حساب شما بازگشت داده خواهد شد",'html',$msgid,$Buton_poin);
}else{
$user['step'] = 'none';
SM($chatID,"👈🏻 این سفارش فعال نمیباشد",'html',null,$Button_Home);
saveJson("melat/$userID.json",$user);
}}else{
$user['step'] = 'none';
SM($chatID,"👈🏻 این سفارش متعلق به شما نمیباشد",'html',null,$Button_Home);
saveJson("melat/$userID.json",$user);
}}else{
$user['step'] = 'none';
SM($chatID,"👈🏻 کد پیگیری سفارش نامعتبر میباشد",'html',null,$Button_Home);
saveJson("melat/$userID.json",$user);
}}}
//##########################################################################
elseif(preg_match('/^cancell-(.*)/', $data, $match)){
    $orderId = function_exists('bot_order_cancel_clean_id') ? bot_order_cancel_clean_id($match[1]) : preg_replace('/[^A-Za-z0-9_\-]/', '', (string)$match[1]);
    if(function_exists('bot_order_cancel_execute')){
        $res = bot_order_cancel_execute($orderId, $userID, $chatID, $msg_id, false, $money);
        if(empty($res['ok'])){
            $txt = function_exists('bot_order_cancel_error_text') ? bot_order_cancel_error_text($res, $money) : '❌ لغو سفارش انجام نشد.';
            bot('editmessagetext', [
                'chat_id' => $chatID,
                'message_id' => $msg_id,
                'text' => $txt,
                'parse_mode' => 'MarkDown',
                'reply_markup' => json_encode(['inline_keyboard'=>[[['text'=>'📋 لیست سفارش‌ها','callback_data'=>'payorders']]]], JSON_UNESCAPED_UNICODE),
            ]);
            exit;
        }
        $refund = (int)($res['refund'] ?? 0);
        $remaining = (int)($res['remaining'] ?? 0);
        $after = $res['wallet_after'];
        $afterLine = $after !== null ? "
💰 موجودی فعلی: **".number_format((int)$after)." {$money}**" : '';
        bot('editmessagetext', [
            'chat_id' => $chatID,
            'message_id' => $msg_id,
            'text' => "✅ سفارش **#{$orderId}** با موفقیت لغو شد.

👥 تعداد باقی‌مانده: **{$remaining}**
💎 مبلغ بازگشتی: **".number_format($refund)." {$money}**".$afterLine,
            'parse_mode' => 'MarkDown',
            'reply_markup' => json_encode(['inline_keyboard'=>[[['text'=>'📋 لیست سفارش‌ها','callback_data'=>'payorders']]]], JSON_UNESCAPED_UNICODE),
        ]);
        exit;
    }
    bot('answercallbackquery', ['callback_query_id'=>$data_id, 'text'=>'سرویس لغو سفارش بارگذاری نشده است.', 'show_alert'=>true]);
    exit;
}
//################ارتباط با ما حذف شده از پیگیری‌ها#############################
elseif($data == "cancelorders"){
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
bot('editmessagetext', [
'chat_id' => $chatID,
'message_id' => $msg_id,
'text'=>"❌ بخش تماس با ما از منوی پیگیری‌ها حذف شده است.

برای مشاهده سفارش‌ها از دکمه زیر استفاده کنید.",
'parse_mode' => "html",
'reply_markup' => json_encode([
'inline_keyboard' => [
[['text'=>"📋 پیگیری سفارشات", 'callback_data'=> 'payorders']],
[["text"=>"➡️ بازگشت", 'callback_data' => "backpaybutton"]],
]])]);
exit;
}
//###############ارتقا پنل################################
elseif(isset($msg) && trim((string)$msg) !== '' && trim((string)$dok7) !== '' && trim((string)$msg) === trim((string)$dok7) && $Tc == 'private'){
bot('sendMessage',[
'chat_id'=>$chatID,
'text'=>"$doktxt7",
'parse_mode'=>"HTML",
'reply_to_message_id'=>$msg_id,
'reply_markup'=>json_encode([
'inline_keyboard'=>[
[['text'=>"♻️پنل فعلی شما : $panels ♻️", 'callback_data'=> '0']],
[['text'=>"💢 ارتقا به پنل حرفه ای 💢", 'callback_data'=> "panel-حرفه ای-$coinpanel1"]],
[['text'=>"🌀 ارتقا به پنل ویژه🌀", 'callback_data'=> "panel-ویژه-$coinpanel2"]],
]])]);
}
//##############ارتقا به پنل###############################
elseif(preg_match('/^panel-(.*)-(.*)/', $data, $match)){
if($user["zirmjmae"] >= $match[2]){
bot('answercallbackquery', [
'callback_query_id' => $data_id,
'text' => "🎉تبریک

پنل شما با موفقیت به پنل $match[1] ارتقا یافت
",
'show_alert' => true
]);
bot('EditMessageReplyMarkup',[
'chat_id'=>$chatID,
'message_id'=>$msg_id,
	'reply_markup'=>json_encode([
'inline_keyboard'=>[
[['text'=>"♻️پنل فعلی شما : {$match[1]} ♻️", 'callback_data'=> '0']],
[['text'=>"💢 ارتقا به پنل حرفه ای 💢", 'callback_data'=> "panel-حرفه ای-$coinpanel1"]],
[['text'=>"🌀 ارتقا به پنل ویژه🌀", 'callback_data'=> "panel-ویژه-$coinpanel2"]],
]])]);
$user['type-panel'] = "$match[1]";
$user['zirmjmae'] = $inv - $match[2];
saveJson("melat/$userID.json",$user);
}else{
bot('answercallbackquery', [
'callback_query_id' => $data_id,
'text' => "❌خطا
برای ارتقا به پنل $match[1] باید $match[2] زیرمجموعه داشته باشید
",
'show_alert' => true
]);
}}
//##################برترین عا#############################
elseif(isset($msg) && trim((string)$msg) !== '' && trim((string)$dok8) !== '' && trim((string)$msg) === trim((string)$dok8) && $Tc == 'private'){
bot('sendmessage',[
'chat_id'=>$chatID,
'text'=>"$doktxt8",
'parse_mode' => "html",
'reply_markup' => json_encode([
'inline_keyboard' => [
[['text'=>"$best1", 'callback_data'=> 'best1']],
[['text'=>"$best2", 'callback_data'=> 'best2'],['text'=>"$best3", 'callback_data'=> 'best3']],
]])]);
}
//################بازگشت به برترین ها###############################
elseif($data == "backbestsbutton"){
$chatID = $update->callback_query->message->chat->id; 
bot('editmessagetext', [
'chat_id' => $chatID,
'message_id' => $msg_id,
'text'=>"تمایل به مشاهده برترین کاربران کدام بخش دارید؟",
'parse_mode' => "html",
'reply_markup' => json_encode([
'inline_keyboard' => [
[['text'=>"$best1", 'callback_data'=> 'best1']],
[['text'=>"$best2", 'callback_data'=> 'best2'],['text'=>"$best3", 'callback_data'=> 'best3']],
]])]);
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
}
//======//
//////////------------------------\\\\\\\\\\\\\\///
else if($data == 'best1' and $Tc == 'private'){
$Buttonoin = json_encode(['inline_keyboard'=>[
[['text'=>"🔙 بازگشت",'callback_data'=>'backbestsbutton']],
]]);
for ($t=1;$t<=10;$t++){
$users = bot_data_get_json('melat/' . top($t,'zirmjmae') . '.json');
$invite = $users['zirmjmae'];
$getid = top($t,'zirmjmae');
if ($invite == ''){
$invite = 0;
} else {
$invite = $invite;
}
if ($getid == ''){
$getid = 0;
} else {
$getid = $getid;
}
$textbartar = $textbartar .= "♾ شماره کاربری : $getid
👤 تعداد جذب زیر مجموعه : $invite\n\n
";
}
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
bot('editmessagetext', [
'chat_id' => $chatID,
'message_id' => $msg_id,
'text'=>"🏆 برترین کاربران در زیرمجموعه گیری 🏆
$textbartar
",
'parse_mode' => "html",
'reply_markup' => json_encode([
'inline_keyboard' => [
[["text"=>"➡️ بازگشت", 'callback_data' => "backbestsbutton"]],
]])]);}
//==========[تعداد عضویت]==============//
elseif($data == "best2"){
for ($t=1;$t<=10;$t++){
$users = bot_data_get_json('melat/' . top($t,'ads') . '.json');
$invite = $users['ads'];
$getid = top($t,'ads');
if ($invite == ''){
$invite = 0;
} else {
$invite = $invite;
}
if ($getid == ''){
$getid = 0;
} else {
$getid = $getid;
}
$textbartar = $textbartar .= "♾ شماره کاربری : $getid
👤 تعداد عضویت : $invite\n\n
";
}
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
bot('editmessagetext', [
'chat_id' => $chatID,
'message_id' => $msg_id,
'text'=>"🏆 برترین کاربران عضویت کانال 🏆
$textbartar",
'parse_mode' => "html",
'reply_markup' => json_encode([
'inline_keyboard' => [
[["text"=>"➡️ بازگشت", 'callback_data' => "backbestsbutton"]],
]])]);}
//==========[تعداد ثبت تبلیغ]==============//
elseif($data == "best3"){
for ($t=1;$t<=10;$t++){
$users = bot_data_get_json('melat/' . top($t,'sefaresh') . '.json');
$invite = $users['sefaresh'];
$getid = top($t,'sefaresh');
if ($invite == ''){
$invite = 0;
} else {
$invite = $invite;
}
if ($getid == ''){
$getid = 0;
} else {
$getid = $getid;
}
$textbartar = $textbartar .= "♾ شماره کاربری : $getid
👤 تعداد سفارشات : $invite\n\n
";
}
$user['step'] = 'none';
saveJson("melat/$userID.json",$user);
bot('editmessagetext', [
'chat_id' => $chatID,
'message_id' => $msg_id,
'text'=>"🏆 برترین کاربران در ثبت سفارش 🏆
$textbartar",
'parse_mode' => "html",
'reply_markup' => json_encode([
'inline_keyboard' => [
[["text"=>"➡️ بازگشت", 'callback_data' => "backbestsbutton"]],
]])]);}
//###############فروشگاه##################################
elseif($msg == "$dok9" and $Tc == 'private'){
    if(!empty($user['phone'])){
        bot('sendMessage',[
            'chat_id'=>$chatID,
            'text'=>bot_shop_home_text(),
            'parse_mode'=>"HTML",
            'reply_to_message_id'=>null,
            'reply_markup'=>bot_shop_main_inline_keyboard()
        ]);
    }else{
        $user['step'] = "phone";
        saveJson("melat/$userID.json",$user);
        bot('sendmessage',[
            'chat_id'=>$chatID,
            'text'=>"📱 لطفا شماره موبایل خود را تایید نمایید.\n\n⚠️ طبق دستور پلیس فتا جهت جلوگیری از خرید با کارت‌های جعلی و دزدی و همچنین احراز هویت، نیاز است شماره تلفن خود را تایید نمایید.\n\n✔️ شماره تلفن شما نزد ما محفوظ است.",
            'reply_markup' => bot_shop_phone_request_keyboard($back)
        ]);
    }
    exit;
}
