setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
try {
$pdo_init = new PDO("mysql:host=$host;charset=utf8", $db_user, $db_pass);
$pdo_init->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo_init->exec("CREATE DATABASE IF NOT EXISTS `$db_name` CHARACTER SET utf8 COLLATE utf8_general_ci;");
$pdo = new PDO("mysql:host=$host;dbname=$db_name;charset=utf8", $db_user, $db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $ex) {
die("Database Connection Error");
}
}
// Auto-create necessary tables
try {
$pdo->exec("CREATE TABLE IF NOT EXISTS `users_info` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
`profile_link` VARCHAR(255),
`team_id` VARCHAR(50) NOT NULL UNIQUE,
`email` VARCHAR(100) NOT NULL,
`blood_group` VARCHAR(10),
`fb_link` VARCHAR(255)
) ENGINE=InnoDB;");
$pdo->exec("CREATE TABLE IF NOT EXISTS `bot_admins` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`telegram_id` VARCHAR(50) NOT NULL UNIQUE
) ENGINE=InnoDB;");
} catch (PDOException $e) {}
// ---- FLAT-FILE DATABASE EMULATION ----
$db_dir = __DIR__ . '/bot_db';
if (!is_dir($db_dir)) {
mkdir($db_dir, 0755, true);
}
class User {
private static function getFilePath($uid) {
global $db_dir;
return $db_dir . "/user_" . $uid . ".json";
}
public static function saveData($key, $value) {
$uid = self::getUserId();
if (!$uid) return;
$file = self::getFilePath($uid);
$data = [];
if (file_exists($file)) {
$data = json_decode(file_get_contents($file), true);
}
$data[$key] = $value;
file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
public static function getData($key) {
$uid = self::getUserId();
if (!$uid) return null;
$file = self::getFilePath($uid);
if (file_exists($file)) {
$data = json_decode(file_get_contents($file), true);
return isset($data[$key]) ? $data[$key] : null;
}
return null;
}
public static function saveUserData($uid, $key, $value) {
$file = self::getFilePath($uid);
$data = [];
if (file_exists($file)) {
$data = json_decode(file_get_contents($file), true);
}
$data[$key] = $value;
file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
public static function getUserData($uid, $key) {
$file = self::getFilePath($uid);
if (file_exists($file)) {
$data = json_decode(file_get_contents($file), true);
return isset($data[$key]) ? $data[$key] : null;
}
return null;
}
public static function getUserId() {
global $update;
if (isset($update['message']['from']['id'])) return $update['message']['from']['id'];
if (isset($update['callback_query']['from']['id'])) return $update['callback_query']['from']['id'];
return null;
}
}
class System {
private static function getFilePath() {
global $db_dir;
return $db_dir . "/system_config.json";
}
public static function set($key, $value) {
$file = self::getFilePath();
$data = [];
if (file_exists($file)) { $data = json_decode(file_get_contents($file), true); }
$data[$key] = $value;
file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
public static function get($key, $default = "https://t.me/+") {
$file = self::getFilePath();
if (file_exists($file)) {
$data = json_decode(file_get_contents($file), true);
$key_alt = str_replace(" ", "_", $key);
if (isset($data[$key])) return $data[$key];
if (isset($data[$key_alt])) return $data[$key_alt];
}
return $default;
}
}
class Bot {
public static function sendMessage($text, $parse_mode = 'html', $reply_markup = null, $chat_id = null) {
if (!$chat_id) $chat_id = User::getUserId();
$url = "https://api.telegram.org/bot" . BOT_TOKEN . "/sendMessage";
$post_fields = ['chat_id' => $chat_id, 'text' => $text, 'parse_mode' => $parse_mode];
if ($reply_markup) {
$post_fields['reply_markup'] = json_encode($reply_markup);
}
return self::curlRequest($url, $post_fields);
}
public static function editMessageText($chat_id, $message_id, $text, $parse_mode = 'HTML', $reply_markup = null) {
$url = "https://api.telegram.org/bot" . BOT_TOKEN . "/editMessageText";
$post_fields = ['chat_id' => $chat_id, 'message_id' => $message_id, 'text' => $text, 'parse_mode' => $parse_mode];
if ($reply_markup) {
$post_fields['reply_markup'] = json_encode($reply_markup);
}
return self::curlRequest($url, $post_fields);
}
public static function answerCallbackQuery($call_id, $text) {
$url = "https://api.telegram.org/bot" . BOT_TOKEN . "/answerCallbackQuery";
return self::curlRequest($url, ['callback_query_id' => $call_id, 'text' => $text]);
}
public static function handleNextCommand($command) {
User::saveData("next_command", $command);
}
public static function clearNextCommand() {
User::saveData("next_command", null);
}
public static function saveData($key, $value) {
User::saveData($key, $value);
}
public static function getData($key) {
return User::getData($key);
}
public static function curlRequest($url, $post_fields) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}
// ---- TELEGRAM ENGINE INTERFACES ----
$content = file_get_contents("php://input");
$update = json_decode($content, true);
if (!$update) {
exit;
}
$chatId = isset($update["message"]) ? $update["message"]["chat"]["id"] : (isset($update["callback_query"]) ? $update["callback_query"]["message"]["chat"]["id"] : null);
$userId = isset($update["message"]) ? $update["message"]["from"]["id"] : (isset($update["callback_query"]) ? $update["callback_query"]["from"]["id"] : null);
$messageId = isset($update["callback_query"]) ? $update["callback_query"]["message"]["message_id"] : null;
$chat_id = User::getUserId();
$u = $chat_id;
$message = isset($update['message']) ? $update['message'] : null;
$call = isset($update['callback_query']) ? $update['callback_query'] : null;
// Global Admin Authorization Engine
$isAdmin = ($userId == $mainAdminId || $chat_id == ADMIN_ID);
if (!$isAdmin && $userId) {
try {
$stmt = $pdo->prepare("SELECT 1 FROM bot_admins WHERE telegram_id = ?");
$stmt->execute([$userId]);
if ($stmt->fetchColumn()) {
$isAdmin = true;
}
} catch (PDOException $e) {
$isAdmin = false;
}
}
// === 1. CALLBACK QUERIES ===
if ($call) {
$call_id = $call['id'];
$data = $call['data'];
$u = $call['from']['id'];
if ($data == "requirements_info") {
Bot::answerCallbackQuery($call_id, "প্রয়োজনীয় তথ্যের তালিকা");
$req_text = (
"📋 অ্যাডমিশন আবশ্যিক শর্তাবলী ও প্রয়োজনীয় নথিপত্র\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"১. 👤 পূর্ণাঙ্গ নাম ও ঠিকানা: ইংরেজিতে সঠিক লিগ্যাল নাম ও বর্তমান স্থায়ী ঠিকানা।\n" .
"২. 📧 যোগাযোগ মাধ্যম: সচল ইমেইল অ্যাড্রেস এবং একটিভ হোয়াটসঅ্যাপ নম্বর।\n" .
"৩. 📸 ছবি: আপনার নিজের ২ কপি স্পষ্ট ল্যাব-প্রিন্ট কোয়ালিটি পাসপোর্ট সাইজ ছবি।\n" .
"৪. 🪪 পরিчয়পত্র: NID কার্ড অথবা অনলাইন জন্ম নিবন্ধনের ছবি এবং নম্বর।\n" .
"৫. 🎥 শপথনামা ভিডিও: প্রদত্ত 'শপথনামা' টেক্সটটি মুখমণ্ডল স্পষ্ট রেখে পাঠ করে ৫-১০ সেকেন্ডের একটি সেলফি ভিডিও ক্লিপ তৈরি রাখতে হবে।\n\n" .
"⚡ সমস্ত তথ্য প্রস্তুত থাকলে নিচে দেওয়া বাটনে ক্লিক করে মূল প্রক্রিয়া শুরু করুন।"
);
$req_markup = ["inline_keyboard" => [[["text" => "📝 রেজিষ্ট্রেশন শুরু করুন", "callback_data" => "start_admission"]]]];
Bot::sendMessage($req_text, "html", $req_markup);
}
elseif ($data == "start_admission") {
try {
Bot::clearNextCommand();
// Fetch Payment Status & Configurations dynamically
$fee_status = System::get("fee_status", "ON");
$fee_amount = System::get("fee_amount", "500 BDT");
if ($fee_status === "ON") {
Bot::answerCallbackQuery($call_id, "পেমেন্ট গেটওয়ে লোড হচ্ছে...");
$pay_notice_text = (
"💳 CSB অফিশিয়াল অ্যাডমিশন ফি নোটিশ\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"আমাদের সিকিউর টিমে অ্যাডমিশন ফর্ম পূরণ করতে হলে প্রথমে অফিশিয়াল ফর্ম ফি সফলভাবে পরিশোধ করতে হবে।\n\n" .
"💰 ফি-এর পরিমাণ: $fee_amount\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"⚠️ নির্দেশনা: নিচে দেওয়া যেকোনো একটি গেটওয়ে বাটন সিলেক্ট করে আমাদের সচল অফিসিয়াল পেমেন্ট নম্বর/অ্যাড্রেস দেখে নিন এবং টাকা পাঠিয়ে ভেরিফিকেশন সম্পন্ন করুন।"
);
// Active/Inactive payment gateway verification mechanism
$inline_pay_buttons = [];
if (System::get("status_pay_bkash", "ON") === "ON") $inline_pay_buttons[] = ["text" => "bKash", "callback_data" => "pay_via_bkash"];
if (System::get("status_pay_nagad", "ON") === "ON") $inline_pay_buttons[] = ["text" => "Nagad", "callback_data" => "pay_via_nagad"];
$inline_pay_buttons2 = [];
if (System::get("status_pay_rocket", "ON") === "ON") $inline_pay_buttons2[] = ["text" => "Rocket", "callback_data" => "pay_via_rocket"];
if (System::get("status_pay_usdt", "ON") === "ON") $inline_pay_buttons2[] = ["text" => "USDT (Binance)", "callback_data" => "pay_via_usdt"];
$pay_markup = ["inline_keyboard" => array_filter([$inline_pay_buttons, $inline_pay_buttons2])];
Bot::sendMessage($pay_notice_text, "html", $pay_markup);
} else {
// If Fee is OFF, directly skip to Step 1 (Full Name Input)
Bot::answerCallbackQuery($call_id, "ফর্ম ফি মওকুফ! রেজিষ্ট্রেশন শুরু হচ্ছে...");
$intro_text = (
"🛡— CSB Official Admission Portal —🛡\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"বর্তমান সেশনের জন্য অ্যাডমিশন ফর্ম ফি সম্পূর্ণ ফ্রি ঘোষণা করা হয়েছে!\n\n" .
"👤 ধাপ-০১: আপনার সম্পূর্ণ নাম (Full Name) ইংরেজিতে লিখে নিচে পাঠান:"
);
User::saveData("adm_pay_txid", "FREE_SESSION");
User::saveData("adm_pay_ss", "FREE_SESSION_NO_IMAGE");
Bot::sendMessage($intro_text, "html");
Bot::handleNextCommand("step_2_address");
}
} catch (Exception $e) {
Bot::sendMessage("⚠️ সিস্টেম ত্রুটি: " . $e->getMessage());
}
}
// Dynamic Gateway Sub-menus
elseif (in_array($data, ["pay_via_bkash", "pay_via_nagad", "pay_via_rocket", "pay_via_usdt"])) {
$method = str_replace("pay_via_", "", $data);
Bot::answerCallbackQuery($call_id, strtoupper($method) . " গেটওয়ে সক্রিয়");
$method_title = ucfirst($method);
$saved_details = System::get("pay_num_" . $method, "01XXXXXXXXX (Not Set Yet)");
$fee_amount = System::get("fee_amount", "500 BDT");
// Dynamic USDT Auto-Conversion Engine (1 USD = 130 BDT)
if ($method === "usdt") {
preg_match('/\d+/', $fee_amount, $amt_matches);
if (!empty($amt_matches)) {
$bdt_value = intval($amt_matches[0]);
$usdt_converted = round($bdt_value / 130, 2);
$display_fee = $fee_amount . " (" . $usdt_converted . " USDT)";
} else {
$display_fee = $fee_amount;
}
} else {
$display_fee = $fee_amount;
}
$type_text = ($method === "usdt") ? "TRC20 Address" : "Personal (Send Money)";
$gateway_text = (
"⚡ CSB Secure Payment — " . strtoupper($method) . "\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"🎯 অ্যামাউন্ট: $display_fee\n" .
"📌 আমাদের $method_title ($type_text):\n\n" .
"$saved_details\n\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"⚠️ উপরের অ্যাড্রেস/নম্বরটি কপি করে সফলভাবে পেমেন্ট সম্পন্ন করার পর নিচের '✅ পেমেন্ট সম্পন্ন করেছি' বাটনে ক্লিক করুন।"
);
$gateway_markup = ["inline_keyboard" => [[["text" => "✅ পেমেন্ট সম্পন্ন করেছি", "callback_data" => "payment_done"]]]];
Bot::sendMessage($gateway_text, "html", $gateway_markup);
}
elseif ($data == "payment_done") {
Bot::answerCallbackQuery($call_id, "ভেরিফিকেশন গেটওয়ে");
Bot::sendMessage("🔑 পেমেন্ট ভেরিফিকেশন (ধাপ-১):\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nআপনার টাকা পাঠানোর বা ট্রান্সফারের সফল ট্রানজেকশন আইডি (Transaction ID / TxID / Hash ID) টাইপ করে নিচে পাঠান:");
Bot::handleNextCommand("pay_step_txid");
}
elseif ($data == "start_fb_submission") {
try {
Bot::answerCallbackQuery($call_id, "ফেসবুক ডাটা সাবমিশন ফর্ম ওপেন হচ্ছে...");
$session_check = User::getUserData($u, "active_fb_session_" . strval($u));
if ($session_check == "yes") {
Bot::sendMessage("🌐 ফেসবুক ভেরিফিকেশন (ধাপ-১):\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nআপনার নতুন তৈরি করা ডেডিকেটেড ফেসবুক অ্যাকাউন্টের নাম (Profile Name) হুবহু লিখে সাবমিট করুন:");
Bot::handleNextCommand("save_fb_name");
} else {
Bot::sendMessage("❌ অ্যাক্সেস রিজেক্টেড! এই বাটনটি শুধুমাত্র অনুমোদিত ও নির্দিষ্ট সেশনের মেম্বারদের জন্য প্রযোজ্য।");
}
} catch (Exception $e) {
Bot::sendMessage("Error: " . $e->getMessage());
}
}
// Gender Selection Callback Handlers
elseif (in_array($data, ["set_gender_male", "set_gender_female"])) {
$gender = ($data === "set_gender_male") ? "Male" : "Female";
User::saveData("adm_gender", $gender);
Bot::answerCallbackQuery($call_id, "Gender: " . $gender);
$cat_msg = "🗂️ ধাপ-১২ (খ): আপনি কোন সুনির্দিষ্ট রোল বা ডেজিগনেশন ক্যাটাগরিতে যুক্ত হতে ইচ্ছুক তা নিচে থেকে সিলেক্ট করুন:";
$reply_markup = [
"inline_keyboard" => [
[["text" => "🎓 New Students", "callback_data" => "set_cat_New_Students"]],
[["text" => "🛡️ Admin", "callback_data" => "set_cat_Admin"]],
[["text" => "🧠 Experts", "callback_data" => "set_cat_Experts"]]
]
];
Bot::sendMessage($cat_msg, "html", $reply_markup);
}
elseif (strpos($data, "set_cat_") === 0) {
$category = str_replace("set_cat_", "", $data);
$category = str_replace("_", " ", $category);
User::saveData("adm_category", $category);
Bot::sendMessage("✅ ক্যাটাগরি ডেটা লক করা হয়েছে! [Category: " . strtoupper($category) . "]\n\n📞 ধাপ-১৩: আপনার পরিবারের অভিভাবকের (পিতা/মাতা/ভাই) একটি সচল মোবাইল নম্বর দিন:");
Bot::handleNextCommand("step_14_own_phone");
}
elseif ($data == "adm_confirm") {
Bot::answerCallbackQuery($call_id, "আপনার ডাটা প্রসেস হচ্ছে...");
$name = User::getData("adm_name");
$addr = User::getData("adm_address");
$email = User::getData("adm_email");
$wh = User::getData("adm_whatsapp");
$tg = User::getData("adm_tguser");
$nid_n = User::getData("adm_nid_num");
$dob = User::getData("adm_dob");
$gender = User::getData("adm_gender");
$cat = User::getData("adm_category");
$f_ph = User::getData("adm_fam_phone");
$o_ph = User::getData("adm_own_phone");
$pic1 = User::getData("adm_pic1");
$pic2 = User::getData("adm_pic2");
$nid_pic = User::getData("adm_nid_pic");
$video = User::getData("adm_video");
$pay_txid = User::getData("adm_pay_txid");
$pay_ss = User::getData("adm_pay_ss");
// Media Group Array Structure (Includes Payment Screenshot if available)
$mediaGroup = [];
if ($pic1 && $pic1 != "FREE_SESSION_NO_IMAGE") $mediaGroup[] = ['type' => 'photo', 'media' => $pic1, 'caption' => "🛡️ CSB Applicant Secure Files [UID: $u]", 'parse_mode' => 'html'];
if ($pic2 && $pic2 != "FREE_SESSION_NO_IMAGE") $mediaGroup[] = ['type' => 'photo', 'media' => $pic2];
if ($nid_pic && $nid_pic != "FREE_SESSION_NO_IMAGE") $mediaGroup[] = ['type' => 'photo', 'media' => $nid_pic];
if ($pay_ss && $pay_ss != "FREE_SESSION_NO_IMAGE") $mediaGroup[] = ['type' => 'photo', 'media' => $pay_ss];
if ($video) $mediaGroup[] = ['type' => 'video', 'media' => $video];
if (!empty($mediaGroup)) {
$ch_m = curl_init("https://api.telegram.org/bot" . BOT_TOKEN . "/sendMediaGroup");
curl_setopt($ch_m, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_m, CURLOPT_POSTFIELDS, ['chat_id' => TARGET_GROUP_ID, 'media' => json_encode($mediaGroup)]);
curl_setopt($ch_m, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch_m);
curl_close($ch_m);
}
// Core Status Messaging Blueprint
$detailsText = (
"📥 নতুন অ্যাডমিশন আবেদন এসেছে! [পর্যালোচনাধীন]\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"👤 নাম: $name\n" .
"🆔 ইউজার UID: $u\n" .
"🏠 ঠিকানা: $addr\n" .
"📧 ইমেইল: $email\n" .
"⚧️ জেন্ডার: $gender\n" .
"🟢 হোয়াটসঅ্যাপ: $wh\n" .
"✈️ টেলিগ্রাম: $tg\n" .
"💳 NID/সনদ নং: $nid_n\n" .
"📅 জন্মতারিখ: $dob\n" .
"🗂️ ক্যাটাগরি: $cat\n" .
"📞 ফ্যামিলি ফোন: $f_ph\n" .
"📱 নিজস্ব ফোন: $o_ph\n" .
"🔑 TxID: $pay_txid\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"⏳ আবেদনের বর্তমান স্থিতি: [Pending]\n" .
"⚠️ নিচের বাটন চেপে অনুমোদন দিলে ডেটা সরাসরি ERP-তে যুক্ত হবে ও ইউজারের সেশন চালু হবে।"
);
$group_markup = [
"inline_keyboard" => [
[
["text" => "✅ Approve User", "callback_data" => "admin_approve_" . $u],
["text" => "❌ Reject User", "callback_data" => "admin_reject_" . $u]
]
]
];
$group_msg_res = Bot::sendMessage($detailsText, "html", $group_markup, TARGET_GROUP_ID);
$group_msg_arr = json_decode($group_msg_res, true);
if (isset($group_msg_arr['result']['message_id'])) {
User::saveData("group_msg_id_" . strval($u), $group_msg_arr['result']['message_id']);
}
$admin_notify = "📢 নতুন আবেদন জমা পড়েছে!\n\n👤 ইউজার: $name\n🆔 আইডি: $u\n\nঅনুমোদন দিতে ক্লিক করুন: /adduser_$u";
Bot::sendMessage($admin_notify, "html", null, ADMIN_ID);
Bot::sendMessage("✅ আপনার আবেদন ও পেমেন্ট ডাটা সফলভাবে সেন্ট্রাল প্যানেলে জমা করা হয়েছে!\n\nআমাদের ইন্টারনাল টিম আপনার ট্রানজেকশন ও ফাইলসমূহ পুঙ্খানুপুঙ্খভাবে পর্যালোচনা করে দ্রুত পরবর্তী আপডেট জানিয়ে দেবে। ধৈর্য ধরে অপেক্ষা করুন। ধন্যবাদ।", "html");
Bot::clearNextCommand();
}
elseif (strpos($data, "admin_approve_") === 0) {
$app_uid = str_replace("admin_approve_", "", $data);
if ($isAdmin) {
Bot::answerCallbackQuery($call_id, "ইউজার অনুমোদিত ও ERP-তে সংরক্ষিত!");
$name = User::getUserData($app_uid, "adm_name");
$addr = User::getUserData($app_uid, "adm_address");
$email = User::getUserData($app_uid, "adm_email");
$wh = User::getUserData($app_uid, "adm_whatsapp");
$tg = User::getUserData($app_uid, "adm_tguser");
$nid_n = User::getUserData($app_uid, "adm_nid_num");
$dob = User::getUserData($app_uid, "adm_dob");
$gender = User::getUserData($app_uid, "adm_gender");
$cat = User::getUserData($app_uid, "adm_category");
$f_ph = User::getUserData($app_uid, "adm_fam_phone");
$o_ph = User::getUserData($app_uid, "adm_own_phone");
$pic1 = User::getUserData($app_uid, "adm_pic1");
$pic2 = User::getUserData($app_uid, "adm_pic2");
$nid_pic = User::getUserData($app_uid, "adm_nid_pic");
$video = User::getUserData($app_uid, "adm_video");
$postData = [
'tg_id' => $app_uid, 'name' => $name, 'address' => $addr, 'email' => $email,
'whatsapp' => $wh, 'tg_username' => $tg, 'nid_number' => $nid_n, 'dob' => $dob,
'gender' => $gender, 'category' => $cat, 'family_phone' => $f_ph, 'own_phone' => $o_ph,
'photo_1' => $pic1, 'photo_2' => $pic2, 'nid_photo' => $nid_pic, 'oath_video' => $video
];
$ch = curl_init(ERP_API_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch);
curl_close($ch);
User::saveUserData($app_uid, "active_fb_session_" . $app_uid, "yes");
$notice_to_user = (
"📢 আবেদন মঞ্জুর নোটিশ | Cyber Sentinel Bangladesh\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"অভিনন্দন! আপনার প্রাথমিক আবেদনটি টিম এডমিন দ্বারা সফলভাবে ভেরিফাইড এবং অ্যাপ্রুভ করা হয়েছে।\n\n" .
"⚠️ জরুরী নির্দেশনা:\n" .
"পরবর্তী চূড়ান্ত ধাপে অফিশিয়াল গেটওয়েতে যুক্ত হওয়ার জন্য আগামী ৪৮ ঘণ্টার মধ্যে আপনার নতুন ফেসবুক প্রোফাইলের তথ্যসমূহ বটের মাধ্যমে সাবমিট করতে হবে। অন্যথায় আপনার সেশনটি স্বয়ংক্রিয়ভাবে এক্সপায়ার (Expire) হয়ে যাবে।\n\n" .
"নিচের বাটনে ক্লিক করে এখনই ফেসবুক ভেরিফিকেশন প্রক্রিয়াটি সম্পন্ন করুন:"
);
$fb_markup = ["inline_keyboard" => [[["text" => "⚠️ Start FB Verification", "callback_data" => "start_fb_submission"]]]];
Bot::sendMessage($notice_to_user, "html", $fb_markup, $app_uid);
$approved_text = (
"📥 নতুন অ্যাডমিশন আবেদন এসেছে! [ERP ড্যাশবোর্ডে সংরক্ষিত]\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"👤 নাম: $name\n" .
"🆔 ইউজার UID: $app_uid\n" .
"🏠 ঠিকানা: $addr\n" .
"📧 ইমেইল: $email\n" .
"⚧️ জেন্ডার: $gender\n" .
"🟢 হোয়াটসঅ্যাপ: $wh\n" .
"✈️ টেলিগ্রাম: $tg\n" .
"💳 NID/সনদ নং: $nid_n\n" .
"📅 জন্মতারিখ: $dob\n" .
"🗂️ ক্যাটাগরি: $cat\n" .
"📞 ফ্যামিলি ফোন: $f_ph\n" .
"📱 নিজস্ব ফোন: $o_ph\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"✅ আবেদনের বর্তমান স্থিতি: [Waiting for FB Verification]\n" .
"ইউজারকে ফেসবুক প্রোফাইল সাবমিট করার জন্য ৪৮ ঘণ্টার অফিসিয়াল নোটিশ পাঠানো হয়েছে এবং ডেটা সফলভাবে ERP ড্যাশবোর্ডে সিঙ্ক করা হয়েছে।"
);
// TARGET_GROUP_ID এডিট হবে হুবহু আগের মতো
$old_msg = User::getUserData($app_uid, "group_msg_id_" . $app_uid);
if($old_msg) {
Bot::editMessageText(TARGET_GROUP_ID, $old_msg, $approved_text, "html");
}
// রিকুয়েস্ট অনুসারে নতুন গ্রুপ আইডি -1003891211232 এ সম্পূর্ণ ডাটা পাঠানো হচ্ছে
Bot::sendMessage($approved_text, "html", null, NEW_REPORT_GROUP_ID);
// নতুন গ্রুপ আইডিতেও মিডিয়া ফাইলসমূহ ফরওয়ার্ড বা পুনরায় পাঠানো হচ্ছে
$mediaGroup = [];
if ($pic1 && $pic1 != "FREE_SESSION_NO_IMAGE") $mediaGroup[] = ['type' => 'photo', 'media' => $pic1, 'caption' => "🛡️ CSB Applicant Secure Files [UID: $app_uid]", 'parse_mode' => 'html'];
if ($pic2 && $pic2 != "FREE_SESSION_NO_IMAGE") $mediaGroup[] = ['type' => 'photo', 'media' => $pic2];
if ($nid_pic && $nid_pic != "FREE_SESSION_NO_IMAGE") $mediaGroup[] = ['type' => 'photo', 'media' => $nid_pic];
if ($video) $mediaGroup[] = ['type' => 'video', 'media' => $video];
if (!empty($mediaGroup)) {
$ch_m = curl_init("https://api.telegram.org/bot" . BOT_TOKEN . "/sendMediaGroup");
curl_setopt($ch_m, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_m, CURLOPT_POSTFIELDS, ['chat_id' => NEW_REPORT_GROUP_ID, 'media' => json_encode($mediaGroup)]);
curl_setopt($ch_m, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch_m);
curl_close($ch_m);
}
}
}
elseif (strpos($data, "admin_reject_") === 0) {
$rej_uid = str_replace("admin_reject_", "", $data);
if ($isAdmin) {
Bot::answerCallbackQuery($call_id, "আবেদন রিজেক্ট করা হয়েছে!");
// PREMIUM ENHANCED REJECTION NOTICE (With Official Support Direct Link)
$reject_notice = (
"❌ আবেদন বাতিল নোটিশ | Cyber Sentinel Bangladesh\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"দুঃখিত, আপনার সাবমিট করা প্রয়োজনীয় তথ্যাবলী, নথিপত্র অথবা পেমেন্ট বিবরণী আমাদের যাচাইকরণ দল (Verification Team) দ্বারা গভীরভাবে পর্যালোচনার পর ত্রুটিপূর্ণ, অসম্পূর্ণ অথবা ভুল বলে প্রমাণিত হয়েছে।\n\n" .
"🛡️ নিরাপত্তা প্রোটোকল:\n" .
"সাইবার স্পেসের উচ্চ নিরাপত্তা রক্ষার্থে আপনার বর্তমান আবেদনটি এই সেশনের জন্য বাতিল (Rejected/Denied) করা হলো।\n\n" .
"💬 সহায়তা কেন্দ্র:\n" .
"আপনার দেওয়া তথ্যের ব্যাপারে যদি কোনো প্রকার সন্দেহ বা দ্বিমত থাকে কিংবা আপনি যদি মনে করেন এটি ভুলবশত হয়েছে, তবে সরাসরি নিচে দেওয়া বোতামে ক্লিক করে আমাদের অফিশিয়াল সাপোর্ট ডেস্কে যোগাযোগ করতে পারেন।"
);
$reject_markup = ["inline_keyboard" => [[["text" => "🧑💻 কন্টাক্ট সাপোর্ট ডেস্ক", "url" => "https://t.me/csbsupportbot?start=Bot34470778"]]]];
Bot::sendMessage($reject_notice, "html", $reject_markup, $rej_uid);
$old_msg = User::getUserData($rej_uid, "group_msg_id_" . $rej_uid);
if($old_msg) {
$name = User::getUserData($rej_uid, "adm_name");
$rejected_text = (
"📥 নতুন অ্যাডমিশন আবেদন [বাতিল করা হয়েছে]\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"👤 নাম: $name\n" .
"🆔 ইউজার UID: $rej_uid\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"❌ আবেদনের বর্তমান স্থিতি: [Rejected / Denied]\n" .
"এডমিন দ্বারা আবেদনটি রিজেক্ট করা হয়েছে। কোনো প্রকার ডেটা ERP সেন্ট্রাল সার্ভারে পাঠানো হয়নি।"
);
Bot::editMessageText(TARGET_GROUP_ID, $old_msg, $rejected_text, "html");
// শর্তানুসারে নতুন গ্রুপ -1003891211232 এ রিজেক্টেড ডাটা পাঠানো হবে না।
}
}
}
elseif (strpos($data, "setlink_") === 0) {
$target_cat = str_replace("setlink_", "", $data);
Bot::answerCallbackQuery($call_id, "লিংক সেটআপ মোড");
Bot::sendMessage("🔗 অনুগ্রহ করে " . strtoupper(str_replace("_", " ", $target_cat)) . " ক্যাটাগরির জন্য আপনার টেলিগ্রাম অফিশিয়াল সিকিউর লিংকটি টেক্সট আকারে পাঠান:", "html");
Bot::handleNextCommand("save_syslink_" . $target_cat);
}
// Toggle Payment Method Status (Admin Menu Injection)
elseif (strpos($data, "toggle_pay_") === 0) {
$method = str_replace("toggle_pay_", "", $data);
$curr_status = System::get("status_pay_" . $method, "ON");
$new_status = ($curr_status === "ON") ? "OFF" : "ON";
System::set("status_pay_" . $method, $new_status);
Bot::answerCallbackQuery($call_id, strtoupper($method) . " Status: " . $new_status);
Bot::sendMessage("ℹ️ গেটওয়ে আপডেট: পেমেন্ট মেথড " . strtoupper($method) . " বর্তমানে সফলভাবে " . $new_status . " করা হয়েছে।");
}
// --- SCRIPT 2 CALLBACK QUERY INJECTIONS ---
elseif ($data == "check_info") {
$text = "🔍 তথ্য অনুসন্ধান পোর্টাল\n\nযেকোনো সদস্যের তথ্য খুঁজে পেতে তার Name, Email, Team ID অথবা Facebook Link লিখে মেসেজ পাঠান।";
Bot::editMessageText($chatId, $messageId, $text, 'HTML');
Bot::answerCallbackQuery($update["callback_query"]["id"], "Ready to search");
exit;
}
// Dynamic Setup Inline Operations from Admin Dashboard
elseif ($data == "toggle_fee") {
$current = System::get("fee_status", "ON");
$new_status = ($current === "ON") ? "OFF" : "ON";
System::set("fee_status", $new_status);
Bot::answerCallbackQuery($call_id, "ফি স্ট্যাটাস: $new_status");
Bot::sendMessage("ℹ️ সিস্টেম আপডেট: অ্যাডমিশন ফি বর্তমানে সফলভাবে " . $new_status . " করা হয়েছে।");
}
elseif ($data == "set_fee_amount") {
Bot::answerCallbackQuery($call_id, "ফি অ্যামাউন্ট মোড");
Bot::sendMessage("💰 অ্যাডমিশন ফর্মের কাস্টম ফি নির্ধারণ করুন (যেমন: 500 BDT বা 5 USDT):");
Bot::handleNextCommand("save_fee_amount_system");
}
elseif (strpos($data, "manage_pay_") === 0) {
$method = str_replace("manage_pay_", "", $data);
Bot::answerCallbackQuery($call_id, "Edit: ".strtoupper($method));
Bot::sendMessage("💳 অনুগ্রহ করে আপনার নতুন " . strtoupper($method) . " নম্বর বা অ্যাড্রেসটি পাঠান:");
Bot::handleNextCommand("save_pay_number_" . $method);
}
if (!$isAdmin) {
Bot::answerCallbackQuery($update["callback_query"]["id"], "❌ অ্যাক্সেস প্রত্যাখ্যান করা হয়েছে!");
exit;
}
if ($data == "admin_panel") {
$text = "⚙️ সেন্ট্রাল কন্ট্রোল প্যানেল (এডমিন)\n\nসিস্টেম পরিচালনার জন্য নিচের অপশনগুলো ব্যবহার করুন:";
$buttons = [
[['text' => '➕ তথ্য যুক্ত করুন', 'callback_data' => 'add_data'], ['text' => '❌ তথ্য মুছুন', 'callback_data' => 'del_data']],
[['text' => '👑 এডমিন যুক্ত করুন', 'callback_data' => 'add_adm'], ['text' => '🗑️ এডমিন সরান', 'callback_data' => 'del_adm']],
[['text' => '🔙 মূল মেনু', 'callback_data' => 'main_menu']]
];
Bot::editMessageText($chatId, $messageId, $text, 'HTML', ["inline_keyboard" => $buttons]);
}
elseif ($data == "main_menu") {
$text = "⚡ সিস্টেম অনলাইন\n\nতথ্য অনুসন্ধান বা ড্যাশবোর্ড পরিচালনা করতে নিচের বাটনটি চাপুন:";
$buttons = [
[['text' => '🔍 তথ্য অনুসন্ধান করুন', 'callback_data' => 'check_info']],
[['text' => '🛠️ কন্ট্রোল প্যানেল', 'callback_data' => 'admin_panel']]
];
Bot::editMessageText($chatId, $messageId, $text, 'HTML', ["inline_keyboard" => $buttons]);
}
elseif ($data == "add_data") {
$text = "📝 নতুন তথ্য যুক্ত করার নিয়ম:\n\nনিচের ফরম্যাটটি কপি করে সঠিক তথ্য দিয়ে এডিট করে চ্যাটে পাঠান:\n\nadd-user\nName: Jon Doe\nProfile Link: https://..\nTEAM Id: CSB-101\nEmail: jon@domain.com\nBlood: O+\nFb Link: https://..";
Bot::editMessageText($chatId, $messageId, $text, 'HTML', ["inline_keyboard" => [[['text' => '🔙 কন্ট্রোল প্যানেল', 'callback_data' => 'admin_panel']]]]);
}
elseif ($data == "del_data") {
$text = "🗑️ তথ্য মুছে ফেলার নিয়ম:\n\nনিচের ফরম্যাট অনুযায়ী কাঙ্ক্ষিত TEAM ID লিখে মেসেজ পাঠান:\n\ndelete-user CSB-101";
Bot::editMessageText($chatId, $messageId, $text, 'HTML', ["inline_keyboard" => [[['text' => '🔙 কন্ট্রোল প্যানেল', 'callback_data' => 'admin_panel']]]]);
}
elseif ($data == "add_adm") {
$text = "👑 নতুন এডমিন যুক্ত করার নিয়ম:\n\nনিচের ফরম্যাট অনুযায়ী টেলিগ্রাম আইডিটি লিখে মেসেজ পাঠান:\n\nadd-admin 123456789";
Bot::editMessageText($chatId, $messageId, $text, 'HTML', ["inline_keyboard" => [[['text' => '🔙 কন্ট্রোল প্যানেল', 'callback_data' => 'admin_panel']]]]);
}
elseif ($data == "del_adm") {
$text = "🗑️ এডমিন পদ বাতিল করার নিয়ম:\n\nনিচের ফরম্যাট অনুযায়ী টেলিগ্রাম আইডিটি লিখে মেসেজ পাঠান:\n\ndelete-admin 123456789";
Bot::editMessageText($chatId, $messageId, $text, 'HTML', ["inline_keyboard" => [[['text' => '🔙 কন্ট্রোল প্যানেল', 'callback_data' => 'admin_panel']]]]);
}
Bot::answerCallbackQuery($update["callback_query"]["id"], "সফল হয়েছে");
exit;
}
// === 2. INCOMING MESSAGES ===
if ($message) {
$text = isset($message['text']) ? trim($message['text']) : '';
$next_command = User::getData("next_command");
if (strpos($text, '/start') === 0) {
Bot::clearNextCommand();
if (preg_match('/\/start submitfb_(\d+)/', $text, $matches)) {
$target_uid = $matches[1];
User::saveData("active_fb_session_" . $chat_id, "yes");
$fb_markup = ["inline_keyboard" => [[["text" => "⚠️ Start FB Verification", "callback_data" => "start_fb_submission"]]]];
Bot::sendMessage("🚀 ফেসবুক প্রোফাইল ভেরিফিকেশন সেশন সক্রিয় করা হয়েছে।\n\nনিচের বাটনটি প্রেস করে ডাটা সাবমিট সম্পন্ন করুন:", "html", $fb_markup);
exit;
}
$start_markup = [
"inline_keyboard" => [
[["text" => "📝 রেজিষ্ট্রেশন শুরু করুন", "callback_data" => "start_admission"]],
[["text" => "📋 কি কি লাগবে?", "callback_data" => "requirements_info"]],
[["text" => "🔍 CSB Member Info", "callback_data" => "check_info"]]
]
];
$premium_start_text = (
"🤖 WELCOME TO CYBER SENTINEL BANGLADESH 🤖\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"👋 হ্যালো, আমাদের অফিশিয়াল ERP ও অ্যাডমিশন পোর্টালে আপনাকে স্বাগতম।\n\n" .
"বাংলাদেশের সাইবার নিরাপত্তা সুসংহত করতে এবং নিজেকে একজন দক্ষ সার্টিফاید মেম্বার হিসেবে গড়ে তুলতে এই প্ল্যাটফর্মটি আপনাকে সাহায্য করবে।\n\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"✨ আমাদের মূল সেবাসমূহ ও সুযোগ- সুবিধা:\n" .
"🔹 অটোমেটেড ERP পোর্টাল — নির্ভুল আবেদন ও দ্রুত ডেটা ভেরিফিকেশন。\n" .
"🔹 মেম্বারশিপ ভেরিফিকেশন — আইডি বা ইমেইল দিয়ে ডাটাবেজ সার্চ ট্র্যাকিং।\n" .
"🔹 অফিশিয়াল কমিউনিটি — সরাসরি সিকিউরড গেটওয়ে ও লাইভ সাপোর্ট।\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"📢 আবেদনকারীদের জন্য নোটিশ:\n" .
"টিমে যুক্ত হতে নিচে দেওয়া 'রেজিষ্ট্রেশন শুরু করুন' বাটনে ক্লিক করে সঠিক তথ্য সাবমিট করুন। কোনো ভুল বা ভুয়া তথ্য প্রদান করলে আবেদনটি সঙ্গে সঙ্গে বাতিল করা হবে।\n\n" .
"🚀 শুরু করতে অনুগ্রহ করে নিচের যেকোনো একটি মেন্যু বাটন ব্যবহার করুন:"
);
Bot::sendMessage($premium_start_text, "html", $start_markup);
exit;
}
// --- INFO & CHECK INFO INTERCEPTOR ---
if ($text == "info" || $text == "check info") {
$reply = "⚡ সিস্টেম অনলাইন\n\nতথ্য অনুসন্ধান বা ড্যাশবোর্ড পরিচালনা করতে নিচের বাটনটি চাপুন:";
$buttons = [];
$buttons[] = [['text' => '🔍 তথ্য অনুসন্ধান করুন', 'callback_data' => 'check_info']];
if ($isAdmin) {
$buttons[] = [['text' => '🛠️ কন্ট্রোল প্যানেল', 'callback_data' => 'admin_panel']];
}
Bot::sendMessage($reply, "html", ["inline_keyboard" => $buttons]);
exit;
}
if ($isAdmin && $text == '/admin') {
Bot::clearNextCommand();
$current_fee_status = System::get("fee_status", "ON");
$current_fee_amount = System::get("fee_amount", "500 BDT");
// Active status load of gateway buttons
$bkash_st = System::get("status_pay_bkash", "ON");
$nagad_st = System::get("status_pay_nagad", "ON");
$rocket_st = System::get("status_pay_rocket", "ON");
$usdt_st = System::get("status_pay_usdt", "ON");
$admin_menu = [
"inline_keyboard" => [
[["text" => "🔗 [Male] New Students", "callback_data" => "setlink_Male_New_Students"], ["text" => "🔗 [Female] New Students", "callback_data" => "setlink_Female_New_Students"]],
[["text" => "🔗 [Male] Admin", "callback_data" => "setlink_Male_Admin"], ["text" => "🔗 [Female] Admin", "callback_data" => "setlink_Female_Admin"]],
[["text" => "🔗 [Male] Experts", "callback_data" => "setlink_Male_Experts"], ["text" => "🔗 [Female] Experts", "callback_data" => "setlink_Female_Experts"]],
[["text" => "⚙️ Fee Status: [" . $current_fee_status . "]", "callback_data" => "toggle_fee"], ["text" => "💰 Set Fee: [ " . $current_fee_amount . " ]", "callback_data" => "set_fee_amount"]],
[["text" => "📱 bKash No", "callback_data" => "manage_pay_bkash"], ["text" => "Toggle: [$bkash_st]", "callback_data" => "toggle_pay_bkash"]],
[["text" => "📱 Nagad No", "callback_data" => "manage_pay_nagad"], ["text" => "Toggle: [$nagad_st]", "callback_data" => "toggle_pay_nagad"]],
[["text" => "📱 Rocket No", "callback_data" => "manage_pay_rocket"], ["text" => "Toggle: [$rocket_st]", "callback_data" => "toggle_pay_rocket"]],
[["text" => "🪙 USDT Addr", "callback_data" => "manage_pay_usdt"], ["text" => "Toggle: [$usdt_st]", "callback_data" => "toggle_pay_usdt"]],
[["text" => "🛠️ Member DB Panel", "callback_data" => "admin_panel"]]
]
];
Bot::sendMessage("⚙️ CSB Central Control Panel (ERP Configuration)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nনিচের কন্ট্রোল বাটনগুলো ব্যবহার করে ছেলে ও মেয়েদের জন্য আলাদা গেটওয়ে লিংক, পেমেন্ট নাম্বারসমূহ, গেটওয়ে অন/অফ ফিল্টার, ফর্ম ফি অন/অফ এবং ফি-এর পরিমাণ তাৎক্ষণিকভাবে মোডিফাই করতে পারবেন।", "html", $admin_menu);
exit;
}
if ($isAdmin && strpos($text, '/adduser_') === 0) {
$app_uid = str_replace('/adduser_', '', $text);
User::saveUserData($app_uid, "active_fb_session_" . $app_uid, "yes");
$notice_to_user = (
"📢 আবেদন মঞ্জুর নোটিশ | Cyber Sentinel Bangladesh\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"অভিনন্দন! আপনার প্রাথমিক আবেদনটি টিম এডমিন দ্বারা সফলভাবে ভেরিফাইড এবং অ্যাপ্রুভ করা হয়েছে।\n\n" .
"⚠️ জরুরী নির্দেশনা:\n" .
"পরবর্তী চূড়ান্ত ধাপে যুক্ত হওয়ার জন্য আগামী ৪৮ ঘণ্টার মধ্যে আপনার নতুন ফেসবুক প্রোফাইলের তথ্যসমূহ বটের মাধ্যমে সাবমিট করতে হবে। অন্যথায় আপনার সেশনটি স্বয়ংক্রিয়ভাবে এক্সপায়ার হয়ে যাবে।\n\n" .
"নিচের বাটনে ক্লিক করে এখনই ফেসবুক ভেরিফিকেশন প্রক্রিয়াটি ধাপে ধাপে সম্পন্ন করুন:"
);
$fb_markup = ["inline_keyboard" => [[["text" => "⚠️ Start FB Verification", "callback_data" => "start_fb_submission"]]]];
Bot::sendMessage($notice_to_user, "html", $fb_markup, $app_uid);
Bot::sendMessage("✅ User $app_uid approved & 48h notice sent via manual command!", "html");
exit;
}
// --- SCRIPT 2 SYSTEM CORE OPERATIONS ---
if ($isAdmin) {
if (strpos($text, "add-user") === 0) {
preg_match('/Name:\s*(.*)\nPhoto Link:\s*(.*)\nTEAM Id:\s*(.*)\nEmail:\s*(.*)\nBlood:\s*(.*)\nFb Link:\s*(.*)/i', $text, $matches);
if (count($matches) >= 7) {
try {
$stmt = $pdo->prepare("INSERT INTO users_info (name, profile_link, team_id, email, blood_group, fb_link) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->execute([trim($matches[1]), trim($matches[2]), trim($matches[3]), trim($matches[4]), trim($matches[5]), trim($matches[6])]);
Bot::sendMessage("✅ সফল: Team ID: " . trim($matches[3]) . "-এর তথ্য ডেটাবেজে সফলভাবে যুক্ত হয়েছে।");
} catch (PDOException $e) {
Bot::sendMessage("❌ ডেটাবেজ ত্রুটি: " . $e->getMessage());
}
} else {
Bot::sendMessage("⚠️ ত্রুটি: ফরম্যাট সঠিক নয়! অনুগ্রহ করে গাইডলাইন অনুযায়ী সঠিক তথ্য প্রদান করুন।");
}
exit;
}
if (strpos($text, "delete-user") === 0) {
$teamId = trim(str_replace("delete-user", "", $text));
if (!empty($teamId)) {
$stmt = $pdo->prepare("DELETE FROM users_info WHERE team_id = ?");
$stmt->execute([$teamId]);
Bot::sendMessage("🗑️ TEAM ID: $teamId এর সমস্ত তথ্য ডেটাবেজ থেকে মুছে ফেলা হয়েছে।");
} else {
Bot::sendMessage("⚠️ ত্রুটি: একটি সঠিক TEAM ID প্রদান করুন।");
}
exit;
}
if (strpos($text, "add-admin") === 0) {
$newAdminId = trim(str_replace("add-admin", "", $text));
if (is_numeric($newAdminId)) {
try {
$stmt = $pdo->prepare("INSERT INTO bot_admins (telegram_id) VALUES (?)");
$stmt->execute([$newAdminId]);
Bot::sendMessage("👑 ID: $newAdminId কে সফলভাবে এডমিন প্যানেলে যুক্ত করা হয়েছে।");
// নতুন অ্যাডমিনের কাছে নোটিফিকেশন পাঠানোর মেকানিজম
$adm_add_notice = (
"👑 এডমিন প্যানেল নোটিফিকেশন | CSB ERP System\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"আপনাকে Cyber Sentinel Bangladesh (CSB) অফিশিয়াল ইন্টিগ্রেটেড প্রিমিয়াম ERP বটের এডমিন প্যানেলে যুক্ত করা হয়েছে।\n\n" .
"🛠️ আপনি এখন থেকে /admin কমান্ড ব্যবহার করে সম্পূর্ণシステム フルコントロール করতে পারবেন।"
);
Bot::sendMessage($adm_add_notice, "html", null, $newAdminId);
} catch (PDOException $e) {
Bot::sendMessage("⚠️ এই আইডিটি ইতিমধ্যে এডমিন তালিকায় রয়েছে অথবা কোনো টেকনিক্যাল ত্রুটি ঘটেছে।");
}
} else {
Bot::sendMessage("⚠️ ত্রুটি: আইডিটি অবশ্যই সংখ্যা (Numeric) হতে হবে।");
}
exit;
}
if (strpos($text, "delete-admin") === 0) {
$remAdminId = trim(str_replace("delete-admin", "", $text));
if (is_numeric($remAdminId)) {
$stmt = $pdo->prepare("DELETE FROM bot_admins WHERE telegram_id = ?");
$stmt->execute([$remAdminId]);
Bot::sendMessage("🗑️ ID: $remAdminId এর এডমিন পারমিশন সফলভাবে বাতিল করা হয়েছে।");
// Admin রিমুভ নোটিশ
$adm_rem_notice = (
"🗑️ এডমিন পারমিশন রিমুভ নোটিশ | CSB ERP System\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"আপনার টেলিগ্রাম আইডিটি CSB Central Server এর এডমিন প্যানেল থেকে সরিয়ে নেওয়া হয়েছে।\n\n" .
"❌ আপনার এডমিন অ্যাক্সেস এবং কন্ট্রোল পারমিশন তাৎক্ষণিকভাবে বাতিল করা হলো।"
);
Bot::sendMessage($adm_rem_notice, "html", null, $remAdminId);
} else {
Bot::sendMessage("⚠️ ত্রুটি: আইডিটি অবশ্যই সংখ্যা (Numeric) হতে হবে।");
}
exit;
}
}
// ---- STATE HANDLER LOOP ----
if ($next_command) {
if (strpos($next_command, "save_syslink_") === 0) {
$cat_type = str_replace("save_syslink_", "", $next_command);
System::set($cat_type, $text);
Bot::sendMessage("✅ " . strtoupper(str_replace("_", " ", $cat_type)) . " ক্যাটাগরির অফিসিয়াল লিংকটি সফলভাবে ডাটাবেজে আপডেট করা হয়েছে।");
Bot::clearNextCommand();
exit;
}
// Handling Dynamic Admin Customization Inputs
if ($next_command == "save_fee_amount_system") {
System::set("fee_amount", $text);
Bot::sendMessage("✅ সফল! অ্যাডমিশন ফি নতুনভাবে সেট করা হয়েছে: " . $text . "");
Bot::clearNextCommand();
exit;
}
if (strpos($next_command, "save_pay_number_") === 0) {
$method_type = str_replace("save_pay_number_", "", $next_command);
System::set("pay_num_" . $method_type, $text);
Bot::sendMessage("✅ সফল! গেটওয়ে " . strtoupper($method_type) . " এর ঠিকানা আপডেট হয়েছে: " . $text . "");
Bot::clearNextCommand();
exit;
}
switch ($next_command) {
// NEW SYSTEM: Payment Sub-Handlers
case "pay_step_txid":
if (!empty($text) && strlen($text) >= 4) {
User::saveData("adm_pay_txid", $text);
Bot::sendMessage("📸 পেমেন্ট ভেরিফিকেশন (ধাপ-২):\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nটাকা পাঠানোর পর সফল পেমেন্ট স্ক্রিনশটটি (Payment Screenshot) সরাসরি ছবি বা ফাইল আকারে আপলোড করুন:");
Bot::handleNextCommand("pay_step_ss");
} else {
Bot::sendMessage("⚠️ ইনভ্যালিড TxID/Hash ID! অনুগ্রহ করে আপনার সঠিক ট্রানজেকশন আইডিটি টাইপ করে পাঠান:");
Bot::handleNextCommand("pay_step_txid");
}
break;
case "pay_step_ss":
if (isset($message['photo']) && count($message['photo']) > 0) {
$file_id = end($message['photo'])['file_id'];
User::saveData("adm_pay_ss", $file_id);
$intro_text = (
"🛡— CSB Official Admission Portal —🛡\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"পেমেন্ট ফাইল রিসিভ করা হয়েছে! ফর্মটি পূরণের সময় সর্বোচ্চ সতর্কতা অবলম্বন করুন。\n\n" .
"👤 ধাপ-০১: আপনার সম্পূর্ণ নাম (Full Name) ইংরেজিতে লিখে নিচে পাঠান:"
);
Bot::sendMessage($intro_text, "html");
Bot::handleNextCommand("step_2_address");
} else {
Bot::sendMessage("⚠️ কোনো ইমেজ পাওয়া যায়নি! অনুগ্রহ করে আপনার সফল ট্রানজেকশনের স্পষ্ট স্ক্রিনশটটি ফাইল/ইমেজ আকারে আপলোড করুন:");
Bot::handleNextCommand("pay_step_ss");
}
break;
case "step_2_address":
try {
$txt = strval($text);
if (strpos($txt, '/') === 0) {
Bot::clearNextCommand();
throw new Exception("Command detected, stopping sequence safety filter.");
}
if (isset($message['text']) && strlen($txt) >= 3 && ctype_alpha($txt[0])) {
User::saveData("adm_name", $txt);
Bot::sendMessage("🏠 ধাপ-০২: আপনার বর্তমান সম্পূর্ণ ঠিকানা (গ্রাম/রোড, পোস্ট অফিস, থানা, জেলা) বিস্তারিতভাবে লিখুন:", "html");
Bot::handleNextCommand("step_3_email");
} else {
Bot::sendMessage("⚠️ ভুল নাম ফরম্যাট! অনুগ্রহ করে কোনো বাংলা অক্ষর, বিশেষ ক্যারেক্টার, ইমোজি বা সংখ্যা ছাড়া আপনার রিয়েল নাম ইংরেজিতে (English) লিখুন (সর্বনিম্ন ৩ অক্ষর):", "html");
Bot::handleNextCommand("step_2_address");
}
} catch (Exception $e) {
if (strpos($e->getMessage(), "Command detected") === false) { Bot::sendMessage("Error: " . $e->getMessage()); }
}
break;
case "step_3_email":
try {
$txt = strval($text);
if (isset($message['text']) && strlen($txt) >= 5) {
User::saveData("adm_address", $txt);
Bot::sendMessage("📧 ধাপ-০৩: আপনার একটি সচল এবং বৈধ ইমেইল অ্যাড্রেস (Valid Email Address) ইনপুট দিন:", "html");
Bot::handleNextCommand("step_4_whatsapp");
} else {
Bot::sendMessage("⚠️ ঠিকানাটি অসম্পূর্ণ মনে হচ্ছে! অনুগ্রহ করে আপনার বর্তমান স্থায়ী ঠিকানাটি একটু স্পষ্ট এবং বিস্তারিতভাবে টেক্সট আকারে লিখুন:", "html");
Bot::handleNextCommand("step_3_email");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_4_whatsapp":
try {
$txt = strtolower(strval($text));
if (isset($message['text']) && strpos($txt, "@") !== false && strpos($txt, ".") !== false) {
User::saveData("adm_email", $txt);
Bot::sendMessage("🟢 ধাপ-০৪: আপনার সচল হোয়াটসঅ্যাপ (WhatsApp) নম্বরটি দিন (যেমন: 01XXXXXXXXX):", "html");
Bot::handleNextCommand("step_5_tguser");
} else {
Bot::sendMessage("⚠️ ভুল বা ইনভ্যালিড ইমেইল! অনুগ্রহ করে একটি সঠিক ও সচল ইমেইল ঠিকানা টাইপ করে পাঠান:", "html");
Bot::handleNextCommand("step_4_whatsapp");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_5_tguser":
try {
$txt = str_replace("+", "", strval($text));
if (isset($message['text']) && ctype_digit($txt) && strlen($txt) >= 10 && strlen($txt) <= 14) {
User::saveData("adm_whatsapp", $message['text']);
Bot::sendMessage("✈️ ধাপ-০৫: আপনার অফিসিয়াল টেলিগ্রাম ইউজারনেমটি (Telegram Username - অবশ্যই '@' সহ) দিন:", "html");
Bot::handleNextCommand("step_6_photo1");
} else {
Bot::sendMessage("⚠️ ভুল মোবাইল নম্বর ফরম্যাট! কোনো টেক্সট, স্পেস বা ইমোজি ছাড়াই শুধুমাত্র সংখ্যায় আপনার সঠিক হোয়াটসঅ্যাপ নম্বরটি দিন:", "html");
Bot::handleNextCommand("step_5_tguser");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_6_photo1":
try {
$txt = strval($text);
if (isset($message['text']) && strlen($txt) >= 2) {
if (strpos($txt, "@") !== 0) { $txt = "@" . $txt; }
User::saveData("adm_tguser", $txt);
Bot::sendMessage("📸 ধাপ-০৬: আপনার নিজের ১ম কপি স্পষ্ট পাসপোর্ট সাইজ ছবি (Photo) ফাইল বা ইমেজ আকারে সরাসরি আপলোড করুন:", "html");
Bot::handleNextCommand("step_7_photo2");
} else {
Bot::sendMessage("⚠️ ভুল ইউজারনেম ফরম্যাট! অনুগ্রহ করে আপনার সঠিক টেলিগ্রাম ইউজারনেমটি ইনপুট দিন:", "html");
Bot::handleNextCommand("step_6_photo1");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_7_photo2":
try {
if (isset($message['photo']) && count($message['photo']) > 0) {
$file_id = end($message['photo'])['file_id'];
User::saveData("adm_pic1", $file_id);
Bot::sendMessage("📸 ধাপ-০৭: আপনার নিজের ২য় কপি ছবি (Photo) একই নিয়মে সরাসরি আপলোড করুন:", "html");
Bot::handleNextCommand("step_8_nid_photo");
} else {
Bot::sendMessage("⚠️ কোনো ছবি পাওয়া যায়নি! অনুগ্রহ করে ফরওয়ার্ড না করে সরাসরি একটি পরিষ্কার ছবি আপলোড করুন:", "html");
Bot::handleNextCommand("step_7_photo2");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_8_nid_photo":
try {
if (isset($message['photo']) && count($message['photo']) > 0) {
$file_id = end($message['photo'])['file_id'];
User::saveData("adm_pic2", $file_id);
Bot::sendMessage("🪪 ধাপ-০৮: আপনার NID CARD অথবা অনলাইন জন্মসনদ (Birth Certificate)-এর সামনের অংশের একটি স্পষ্ট ছবি সরাসরি আপলোড করুন:", "html");
Bot::handleNextCommand("step_9_nid_num");
} else {
Bot::sendMessage("⚠️ ফাইল ত্রুটি! অনুগ্রহ করে আপনার ২য় ছবি ফাইলটি সরাসরি অ্যাটাচমেন্ট আকারে আপলোড করুন:", "html");
Bot::handleNextCommand("step_8_nid_photo");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_9_nid_num":
try {
if (isset($message['photo']) && count($message['photo']) > 0) {
$file_id = end($message['photo'])['file_id'];
User::saveData("adm_nid_pic", $file_id);
Bot::sendMessage("💳 ধাপ-০৯: আপনার আপলোডকৃত NID অথবা অনলাইন জন্মসনদের নম্বরটি (ID Number) নিখুঁতভাবে টাইপ করে পাঠান:", "html");
Bot::handleNextCommand("step_10_dob");
} else {
Bot::sendMessage("⚠️ কার্ডের ছবি পাওয়া যায়নি! ভেরিফিকেশনের সুবিধার্থে আপনার ডকুমেন্টটির স্পষ্ট ছবি সরাসরি আপলোড করুন:", "html");
Bot::handleNextCommand("step_9_nid_num");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_10_dob":
try {
$txt = str_replace("+", "", strval($text));
if (isset($message['text']) && ctype_digit($txt) && strlen($txt) >= 10) {
User::saveData("adm_nid_num", $txt);
Bot::sendMessage("📅 ধাপ-১০: আপনার সঠিক জন্মতারিখ ইনপুট দিন (ফরম্যাট: DD/MM/YYYY - যেমন: 25/12/2002):", "html");
Bot::handleNextCommand("step_11_video");
} else {
Bot::sendMessage("⚠️ ভুল ডকুমেন্ট নম্বর! কোনো অক্ষর বা স্পেস ছাড়া শুধুমাত্র সংখ্যায় আপনার সঠিক আইডি নম্বরটি দিন (সর্বনিম্ন ১০ ডিজিট):", "html");
Bot::handleNextCommand("step_10_dob");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_11_video":
try {
$txt = strval($text);
if (isset($message['text']) && strlen($txt) >= 8) {
User::saveData("adm_dob", $txt);
$oath_text = (
"🎥 ধাপ-১১: সেলফি ক্যামেরা অন করে মুখমণ্ডল স্পষ্ট রেখে নিচের শপথনামাটি স্পষ্টভাবে পাঠ করে একটি ভিডিও ক্লিপ রেকর্ড করে পাঠান:\n\n" .
"🛡️ শপথনামা (Oath) 🛡️\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"আমি শপথ করছি যে, আমি কাজ শিখে দেশের সেবা করবো এবং বাংলাদেশের সাইবার নিরাপত্তা রক্ষায় নিজেকে প্রস্তুত রাখবো।\n\n" .
"আমি Cyber Sentinel Bangladesh (CSB) টিমের একজন গর্বিত সদস্য হিসেবে সততা, নিষ্ঠা ও সাহসিকতার সাথে দায়িত্ব পালন করবো। সব ধর্ম ও মানুষের অধিকার রক্ষায় মানবতার পক্ষে থাকবো।\n\n" .
"আমি কখনো আমার শিক্ষা বা দক্ষতা দেশের বিরুদ্ধে কিংবা কারো ক্ষতির জন্য ব্যবহার করবো না। CSB-এর সকল নিয়ম-কানুন সুশৃঙ্খলভাবে মেনে চলবো।\n\n" .
"🤍 আমিন 🤍"
);
Bot::sendMessage($oath_text, "html");
Bot::handleNextCommand("step_12_cat");
} else {
Bot::sendMessage("⚠️ ভুল ফরম্যাট! অনুগ্রহ করে উদাহরণটি অনুসরণ করে আপনার সঠিক জন্মতারিখটি লিখুন (যেমন: 15/08/2003):", "html");
Bot::handleNextCommand("step_11_video");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_12_cat":
try {
$file_id = null;
if (isset($message['video'])) { $file_id = $message['video']['file_id']; }
elseif (isset($message['video_note'])) { $file_id = $message['video_note']['file_id']; }
if ($file_id) {
User::saveData("adm_video", strval($file_id));
// New Gender Selection Step (Step 12-A)
$gender_msg = "⚧️ ধাপ-১২ (ক): অনুগ্রহ করে আপনার জেন্ডার (Gender) সিলেক্ট করুন:";
$gender_markup = [
"inline_keyboard" => [
[["text" => "♂️ Male (ছেলে)", "callback_data" => "set_gender_male"]],
[["text" => "♀️ Female (মেয়ে)", "callback_data" => "set_gender_female"]]
]
];
Bot::sendMessage($gender_msg, "html", $gender_markup);
Bot::clearNextCommand(); // Switch configuration context to callback engine
} else {
Bot::sendMessage("⚠️ ভিডিও ফাইল সনাক্ত করা যায়নি! আপনার মুখমণ্ডল এবং ভয়েস স্পষ্ট রেখে করা ছোট ভিডিও ফাইল বা ভিডিও নোটটি সরাসরি সেন্ড করুন:", "html");
Bot::handleNextCommand("step_12_cat");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_14_own_phone":
try {
$txt = str_replace("+", "", strval($text));
if (isset($message['text']) && ctype_digit($txt) && strlen($txt) >= 10 && strlen($txt) <= 14) {
User::saveData("adm_fam_phone", $message['text']);
Bot::sendMessage("📱 ধাপ-১৪: আপনার নিজের ব্যক্তিগত এবং সর্বদা সচল থাকে এমন একটি মোবাইল নম্বর দিন:", "html");
Bot::handleNextCommand("step_15_preview");
} else {
Bot::sendMessage("⚠️ ভুল নম্বর ফরম্যাট! অনুগ্রহ করে অভিভাবকের সচল ও সঠিক ১১ ডিজিটের মোবাইল নম্বরটি দিন:");
Bot::handleNextCommand("step_14_own_phone");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "step_15_preview":
try {
$txt = str_replace("+", "", strval($text));
if (isset($message['text']) && ctype_digit($txt) && strlen($txt) >= 10 && strlen($txt) <= 14) {
User::saveData("adm_own_phone", $message['text']);
$name = User::getData("adm_name");
$addr = User::getData("adm_address");
$email = User::getData("adm_email");
$wh = User::getData("adm_whatsapp");
$tg = User::getData("adm_tguser");
$nid_n = User::getData("adm_nid_num");
$dob = User::getData("adm_dob");
$gender = User::getData("adm_gender");
$cat = User::getData("adm_category");
$f_ph = User::getData("adm_fam_phone");
$o_ph = User::getData("adm_own_phone");
$parent_txid = User::getData("adm_pay_txid");
$preview = (
"📝 আবেদনকারীর সকল তথ্যের প্রিভিউ (Review)\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"👤 নাম: {$name}\n" .
"🏠 ঠিকানা: {$addr}\n" .
"📧 ইমেইল: {$email}\n" .
"⚧️ জেন্ডার: {$gender}\n" .
"🟢 হোয়াটসঅ্যাপ: {$wh}\n" .
"✈️ টেলিগ্রাম: {$tg}\n" .
"💳 NID/জন্মসনদ নং: {$nid_n}\n" .
"📅 জন্মতারিখ: {$dob}\n" .
"🗂️ ক্যাটাগরি: {$cat}\n" .
"📞 ফ্যামিলি ফোন: {$f_ph}\n" .
"📱 নিজের ফোন: {$o_ph}\n" .
"🔑 TxID: {$parent_txid}\n\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"⚠️ প্রদত্ত ডেটা সাবমিট করার পূর্বে ভালোভাবে রি-চেক করে নিন। সব কিছু সঠিক থাকলে নিচের বাটন চেপে সাবমিশন নিশ্চিত করুন।"
);
$reply_markup = ["inline_keyboard" => [[["text" => "✅ Confirm Application", "callback_data" => "adm_confirm"]]]];
Bot::sendMessage($preview, "html", $reply_markup);
} else {
Bot::sendMessage("⚠️ ভুল নম্বর ফরম্যাট! অনুগ্রহ করে আপনার নিজস্ব সচল মোবাইল নম্বরটি পুনরায় সঠিকভাবে টাইপ করুন:", "html");
Bot::handleNextCommand("step_15_preview");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . $e->getMessage()); }
break;
case "save_fb_name":
if (!empty($text)) {
User::saveData("adm_fb_name", $text);
Bot::sendMessage("🔗 ফেসবুক ভেরিফিকেশন (ধাপ-২):\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nআপনার উক্ত ফেসবুক অ্যাকাউন্টের সম্পূর্ণ ইউআরএল লিংক (Profile Link) কপি করে পেস্ট করুন:");
Bot::handleNextCommand("save_fb_link_and_final");
} else {
Bot::sendMessage("⚠️ অনুগ্রহ করে আপনার সঠিক ফেসবুক প্রোফাইলের নাম লিখে পাঠান:");
Bot::handleNextCommand("save_fb_name");
}
break;
case "save_fb_link_and_final":
try {
$txt = isset($message['text']) ? trim(strtolower(strval($message['text']))) : '';
if (isset($message['text']) && (strpos($txt, "facebook.com") !== false || strpos($txt, "fb.com") !== false)) {
User::saveData("adm_fb_link", $message['text']);
$fb_name = User::getData("adm_fb_name");
$fb_link = User::getData("adm_fb_link");
$name = User::getData("adm_name");
$addr = User::getData("adm_address");
$email = User::getData("adm_email");
$wh = User::getData("adm_whatsapp");
$tg = User::getData("adm_tguser");
$nid_n = User::getData("adm_nid_num");
$dob = User::getData("adm_dob");
$gender = User::getData("adm_gender");
$user_category = User::getData("adm_category");
$f_ph = User::getData("adm_fam_phone");
$o_ph = User::getData("adm_own_phone");
$final_full_database_text = (
"📥 নতুন অ্যাডমিশন আবেদন এসেছে! [ERP ড্যাশবোর্ডে সংরক্ষিত]\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"👤 নাম: $name\n" .
"🆔 ইউজার UID: $u\n" .
"🏠 ঠিকানা: $addr\n" .
"📧 ইমেইল: $email\n" .
"⚧️ জেন্ডার: $gender\n" .
"🟢 হোয়াটসঅ্যাপ: $wh\n" .
"✈️ টেলিগ্রাম: $tg\n" .
"💳 NID/সনদ নং: $nid_n\n" .
"📅 জন্মতারিখ: $dob\n" .
"🗂️ ক্যাটাগরি: $user_category\n" .
"📞 ফ্যামিলি ফোন: $f_ph\n" .
"📱 নিজস্ব ফোন: $o_ph\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" .
"✅ আবেদনের বর্তমান স্থিতি: [Verified]\n" .
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" .
"🌐 FB Name: " . $fb_name . "\n" .
"🔗 FB Link: " . $fb_link
);
$old_msg = User::getData("group_msg_id_" . strval($u));
if ($old_msg) {
Bot::editMessageText(TARGET_GROUP_ID, $old_msg, $final_full_database_text, "html", null);
} else {
Bot::sendMessage($final_full_database_text, "HTML", null, TARGET_GROUP_ID);
}
// Gender-Based Link Routing Engine Implementation
$gender_route_key = $gender . "_" . str_replace(" ", "_", $user_category); // Output format example: "Male_New_Students"
$custom_category_url = System::get($gender_route_key, "https://t.me/+BJLdckUFTGcwY2E9");
$success_msg = (
"🎉 আপনার ভেরিফিকেশন এবং ফেসবুক অ্যাকাউন্ট সাবমিশন সফলভাবে সম্পন্ন হয়েছে!\n\n" .
"আপনাকে Cyber Sentinel Bangladesh (CSB) টিমে চূড়ান্তভাবে স্বাগত জানানো হলো। নিচে আপনার জেন্ডার ও ডেডিকেটেড ক্যাটাগরি (" . $gender . " - " . $user_category . ") অনুযায়ী অফিশিয়াল ইনভাইটেশন লিংক জেনারেট করা হয়েছে।"
);
$reply_markup = [
"inline_keyboard" => [
[["text" => "📢 Join Official Channel", "url" => $custom_category_url]],
[["text" => "🛡️ CSB Main Group", "url" => "https://t.me/+DjE7NTC2TINiNWI1"]]
]
];
Bot::sendMessage($success_msg, "html", $reply_markup);
User::saveUserData($u, "active_fb_session_" . strval($u), "no");
Bot::clearNextCommand();
} else {
Bot::sendMessage("⚠️ ভুল ফেসবুক ইউআরএল! অনুগ্রহ করে একটি সঠিক ও লিগ্যাল ফেসবুক প্রোফাইল লিংক কপি করে পাঠান:", "html");
Bot::handleNextCommand("save_fb_link_and_final");
}
} catch (Exception $e) { Bot::sendMessage("Error: " . strval($e)); }
break;
}
exit;
}
// --- FALLBACK USER SEARCH ---
if (!empty($text)) {
try {
$stmt = $pdo->prepare("SELECT * FROM users_info WHERE name LIKE ? OR email = ? OR team_id = ? OR fb_link = ? LIMIT 1");
$searchTerm = "%" . $text . "%";
$stmt->execute([$searchTerm, $text, $text, $text]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
$reply = "📋 সদস্যের প্রোফাইল তথ্য:\n" . str_repeat("━", 15) . "\n\n";
$reply .= "👤 নাম: " . htmlspecialchars($user['name']) . "\n";
$reply .= "🆔 টিম আইডি: " . htmlspecialchars($user['team_id']) . "\n";
$reply .= "📧 ইমেইল: " . htmlspecialchars($user['email']) . "\n";
$reply .= "🩸 রক্তের গ্রুপ: " . ($user['blood_group'] ? htmlspecialchars($user['blood_group']) : 'N/A') . "\n\n";
$reply .= "🔗 Photo লিংক: " . (!empty($user['profile_link']) ? htmlspecialchars($user['profile_link']) : 'N/A') . "\n";
$reply .= "🌐 ফেসবুক লিংক: " . ($user['fb_link'] ? htmlspecialchars($user['fb_link']) : 'N/A') . "\n";
$reply .= str_repeat("━", 15);
Bot::sendMessage($reply, "html");
} else {
if (strpos($text, '/') !== 0) {
$reply = "❌ দুঃখিত, \"" . htmlspecialchars($text) . "\" এর সাথে মিলে যায় এমন কোনো তথ্য সিস্টেমে খুঁজে পাওয়া যায়নি।";
Bot::sendMessage($reply, "html");
}
}
} catch (PDOException $e) {
Bot::sendMessage("❌ সিস্টেমে একটি অভ্যন্তরীণ কারিগরি ত্রুটি ঘটেছে।");
}
}
}
ob_end_clean();
?>