میخوام یه ربات برای مدیریت تیکت ها در تلگرام بزنم با قابلیت های مختلف این دیتابیسی هست که براش طراحی کردم: CREATE TABLE IF NOT EXISTS `categories` ( `Id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_bin NOT NULL, `description` text COLLATE utf8mb4_bin, `required_rank` int NOT NULL DEFAULT '1', `is_active` int DEFAULT '1', `create_at` int DEFAULT '0', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; INSERT INTO `categories` (`Id`, `name`, `description`, `required_rank`, `is_active`, `create_at`) VALUES (1, 'ارتباط با ادمین ها', 'در این قسمت می توانید با ادمین های سرور سمپ ارتباط برقرار کنید.', 1, 1, 1764711059), (2, 'ارتباط با سوپروایزر', 'در این قسمت می توانید با سوپروایزر سرور سمپ ارتباط برقرار کنید.', 7, 1, 1764711059), (3, 'ارتباط منیجر', 'در این قسمت می توانید با منیجر سرور سمپ ارتباط برقرار کنید.', 8, 1, 1764711059), (4, 'ارتباط با فاندر ', 'در این قسمت می توانید با فاندر سرور سمپ ارتباط برقرار کنید.', 9, 1, 1764711059), (5, 'ارتباط با پشتیبانی فنی ربات', 'در این قسمت می توانید با بخش توسعه ربات ارتباط برقرار کنید.', 10, 1, 1764711059); CREATE TABLE IF NOT EXISTS `settings` ( `Id` int NOT NULL AUTO_INCREMENT, `Type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `Value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40000 ALTER TABLE `settings` DISABLE KEYS */; INSERT INTO `settings` (`Id`, `Type`, `Value`) VALUES (1, 'owner', '1391902688'), (2, 'bot_status', '1'), (3, 'start_text', '👋 درود #name#\r\nبه ربات پشتیبانی تهران گیمینگ خوش آمدید.\r\n\r\nبرای ارتباط با پشتیبانی می‌توانید تیکت جدید ایجاد کنید.'), (4, 'spam_time', '3'), (5, 'spam_limit', '5'); /*!40000 ALTER TABLE `settings` ENABLE KEYS */; -- Dumping structure for table telegramticketmanager.tickets CREATE TABLE IF NOT EXISTS `tickets` ( `Id` int NOT NULL AUTO_INCREMENT, `from_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0', `category_id` int DEFAULT NULL, `ticket_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, `subject` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, `status` int NOT NULL DEFAULT '1' COMMENT '0 = Close, 1 = Open, 2 = Anwered', `update_at` int DEFAULT '0', `create_at` int DEFAULT '0', PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; CREATE TABLE IF NOT EXISTS `ticket_messages` ( `Id` int NOT NULL AUTO_INCREMENT, `Type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `sender_type` int NOT NULL DEFAULT '0' COMMENT '0 = user, 1 = staff', `from_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `ticket_id` int NOT NULL, `message` text COLLATE utf8mb4_bin NOT NULL, `file_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `file_caption` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, `date` char(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `time` char(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; CREATE TABLE IF NOT EXISTS `users` ( `Id` int NOT NULL AUTO_INCREMENT, `from_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, `Admin` varchar(20) COLLATE utf8mb4_bin NOT NULL, `InTicket` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0', `Banned` int NOT NULL DEFAULT '0', `BanBy` int NOT NULL DEFAULT '0', `BanReason` int NOT NULL DEFAULT '0', `Spam` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, `update_at` int DEFAULT '0', `create_at` int DEFAULT '0', PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; این هم کدی هست که تا اینجا زدم و مشکل هم داره: '149.154.160.0', 'upper' => '149.154.175.255'], ['lower' => '91.108.4.0', 'upper' => '91.108.7.255'], ]; $ip_dec = (float) sprintf("%u", ip2long($_SERVER['REMOTE_ADDR'])); $ok = false; foreach ($telegram_ip_ranges as $telegram_ip_range) if (!$ok) { $lower_dec = (float) sprintf("%u", ip2long($telegram_ip_range['lower'])); $upper_dec = (float) sprintf("%u", ip2long($telegram_ip_range['upper'])); if ($ip_dec >= $lower_dec and $ip_dec <= $upper_dec) $ok = true; } if (!$ok) exit(header("location: index.php")); error_reporting(0); include_once "config.php"; define('API_TOKEN', $token); $db = mysqli_connect('localhost', $databaseUser, $databasePass, $databaseName); date_default_timezone_set('Asia/Tehran'); $date = date('Y/m/d | H:i:s'); #==================================================# functions #==================================================# function sendAPI($method, $datas = []) { $url = "https://api.telegram.org/bot" . API_TOKEN . "/" . $method; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $datas); $res = curl_exec($ch); if (curl_error($ch)) { var_dump(curl_error($ch)); } else { return json_decode($res); } } #==================================================# function sendMessage($chat_id, $text, $parse_mode = '', $keyboard = '', $message_id = '') { return sendAPI('sendMessage', [ 'chat_id' => $chat_id, 'text' => $text, 'parse_mode' => $parse_mode, 'disable_web_page_preview' => true, 'reply_markup' => $keyboard, 'reply_to_message_id' => $message_id ]); } #==================================================# function editMessageText($chat_id, $message_id, $text, $parse_mode = null, $keyboard = null) { sendAPI('editMessageText', [ 'chat_id' => $chat_id, 'message_id' => $message_id, 'text' => $text, 'parse_mode' => $parse_mode, 'reply_markup' => $keyboard, 'disable_web_page_preview' => true, ]); } function editMessageReplyMarkup($chat_id, $message_id, $keyboard) { sendAPI('editMessageReplyMarkup', [ 'chat_id' => $chat_id, 'message_id' => $message_id, 'reply_markup' => $keyboard, ]); } #==================================================# function deleteMessage($chat_id, $message_id) { sendAPI('deleteMessage', [ 'chat_id' => $chat_id, 'message_id' => $message_id, ]); } #==================================================# function ForwardMessage($KojaShe, $AzKoja, $KodomMSG) { return sendAPI('ForwardMessage', [ 'chat_id' => $KojaShe, 'from_chat_id' => $AzKoja, 'message_id' => $KodomMSG, ]); } function answercallbackquery($callback_query_id, $text, $show_alert = true) { sendAPI('answercallbackquery', [ 'callback_query_id' => $callback_query_id, 'text' => $text, 'show_alert' => $show_alert ]); } #==================================================# function getChat($chat_id) { $result = sendAPI('getChat', [ 'chat_id' => $chat_id, ]); $invite_link = $result->result->invite_link ?: sendAPI('exportChatInviteLink', ['chat_id' => $chat_id])->result; $result->result->invite_link = $invite_link; return $result; } #==================================================# function random($max = 10) { $textChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789'; $textRandom = ''; for ($i = 0; $i <= $max; $i++) $textRandom .= $textChar[rand(0, strlen($textChar))]; return $textRandom; } #==================================================# function convert($size) { $i = null; return round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . ['', 'K', 'M', 'G', 'T', 'P'][$i] . 'B'; } #==================================================# function doc($name) { switch ($name) { case 'document': return "پرونده (سند)"; break; case 'video': return "ویدیو"; break; case 'photo': return "عکس"; break; case 'voice': return "ویس"; break; case 'audio': return "موزیک"; break; case 'sticker': return "استیکر"; break; default: return "ناشناس ..."; break; } } #=============================# SPAM #=============================# function Spam($from_id) { global $db; $spam_status = explode('|', mysqli_fetch_assoc($db->query("SELECT `spam` FROM `user` WHERE `from_id` = '$from_id' "))['spam']); $spam_time = mysqli_fetch_assoc($db->query("SELECT `type_id` FROM `settings` WHERE `type` = 'spam_time'"))['type_id'] ?: 2; $spam_limit = mysqli_fetch_assoc($db->query("SELECT `type_id` FROM `settings` WHERE `type` = 'spam_limit'"))['type_id'] ?: 7; if ($spam_status) { if (strpos($spam_status[0], "spam") !== false) { if ($spam_status[1] >= time()) exit(false); else $spam_status = [1, time() + 2]; } elseif (time() < $spam_status[1]) { if ($spam_status[0] >= $spam_limit) { $time = time() + ($spam_time * 60); $db->query("UPDATE `user` SET `spam` = 'spam|$time' WHERE `from_id` = '$from_id'"); sendMessage($from_id, "جهت جلوگیری از اسپم ربات شما به مدت " . $spam_time . " دقیقه از ربات ما بلاک شدید.⏳"); exit(false); } else $spam_status = [$spam_status[0] + 1, $spam_status[1]]; } else $spam_status = [1, time() + 2]; $db->query("UPDATE `user` SET `spam` = '$spam_status[0]|$spam_status[1]' WHERE `from_id` = '$from_id'"); } else { $time = time() + 2; $db->query("UPDATE `user` SET `spam` = '0|$time' WHERE `from_id` = '$from_id'"); } } #==================================================# updates #==================================================# $update = json_decode(file_get_contents('php://input')); $message = $update->message; @$chat_id = $update->message->chat->id ?? $update->callback_query->message->chat->id; @$from_id = $update->message->from->id ?? $update->callback_query->from->id; @$text = $update->message->text ?? $update->channel_post->text; @$first_name = $update->message->from->first_name ?? $update->callback_query->from->first_name; @$last_name = $update->message->from->last_name ?? $update->callback_query->from->last_name; @$username = $update->message->from->username ?? $update->callback_query->from->username ?? 'sendAPI'; @$type = $update->message->chat->type ?? $update->callback_query->message->chat->type ?? $update->channel_post->chat->type; @$message_id = $update->message->message_id ?? $update->callback_query->message->message_id; @$reply_message_id = $update->message->reply_to_message->message_id ?? $update->callback_query->message->reply_to_message->message_id; @$reply_from_id = $update->message->reply_to_message->chat->id ?? $update->callback_query->message->reply_to_message->chat->id; @$data = $update->callback_query->data; @$callback_query_text = $update->callback_query->message->text; @$gap_id = $update->message->chat->id ?? $update->callback_query->message->chat->id; @$channel_id = $update->channel_post->chat->id; @$channel_message_id = $update->channel_post->message_id; @$callback_query_id = $update->callback_query->id; @$forward_from_chat_id = $update->message->forward_from_chat->id; @$forward_from_chat_title = $update->message->forward_from_chat->title; @$forward_from_chat_type = $update->message->forward_from_chat->type; @$forward_from_chat_username = $update->message->forward_from_chat->username; @$profile = sendAPI("getUserProfilePhotos", ['user_id' => $from_id])->result->photos[0][0]->file_id; @$botInfo = sendAPI('getMe')->result; @$usernamebot = $botInfo->username; @$first_namebot = $botInfo->first_name; @$time = time(); $db->query("SET NAMES 'utf8'"); $db->set_charset('utf8mb4'); $user_sql = $db->query("SELECT * FROM `users` WHERE `from_id` = '$from_id' LIMIT 1"); if (mysqli_num_rows($user_sql) == 0 & $type == "private") $db->query("INSERT INTO `users`(`from_id`, `InTicket`, `update_at`, `create_at`) VALUES ('$from_id', '0', '$time', '$time')"); $db->query("UPDATE `users` SET `update_at` = '$time', `create_at` = '$time' WHERE `from_id` = '$from_id'"); Spam($from_id); $user = mysqli_fetch_assoc($user_sql); $InTicket = $user['InTicket']; $SetOwner = $db->query("SELECT * FROM `settings` WHERE `Type` = 'owner' AND `Value` = '$from_id' LIMIT 1"); $AdminRank = $user['Admin']; if(mysqli_num_rows($SetOwner) == 1 && $AdminRank != 11) { $AdminRank = 11; $db->query("UPDATE `users` SET `Admin` = '$AdminRank', `update_at` = '$time' WHERE `from_id` = '$from_id'"); } if($AdminRank == 0) { $btn_home = json_encode([ 'keyboard' => [ [['text' => "🎫 ایجاد تیکت جدید"]], [['text' => "📋 تیکت‌های من"], ['text' => "ℹ️ اطلاعات"]] ], 'resize_keyboard' => true ]); } else { $btn_home = json_encode([ 'keyboard' => [ [['text' => "🎫 ایجاد تیکت جدید"]], [['text' => "📋 تیکت‌های من"], ['text' => "ℹ️ اطلاعات"]], [['text' => "👤 مدیریت"]] ], 'resize_keyboard' => true ]); } #=======================# $btn_back = json_encode([ 'keyboard' => [ [['text' => "🔙 بازگشت"]] ], 'resize_keyboard' => true ]); #=======================# $remove = json_encode([ 'remove_keyboard' => [], 'remove_keyboard' => true ]); if (mysqli_fetch_assoc($db->query("SELECT `Value` FROM `settings` WHERE `Type` = 'bot_status'"))['type_id'] == 'off' and $AdminRank == 0) { sendMessage($from_id, '⛔️ ربات خاموش است لطفا بعدا تلاش کنید.', null, $remove); exit(false); } elseif ($user['Banned'] == '1' and mysqli_num_rows($admin_sql) == 0) { sendMessage($from_id, '⛔️ شما از ربات بن شدید.', null, $remove); exit(false); } $Iquery = $update->inline_query->query; $IqId = $update->inline_query->id; if ($text == '/start' or $text == "🔙") { $start_text = mysqli_fetch_assoc($db->query("SELECT `Value` FROM `settings` WHERE `Type` = 'start_text'")); $start_text = str_replace(['#id#', '#name#', '#username#'], [$from_id, $first_name, "@$username"], $start_text); sendMessage($from_id, $start_text, 'html', $btn_home, $message_id); $db->query("UPDATE `users` SET `InTicket` = '0' WHERE `from_id` = '$from_id' LIMIT 1"); } میخوام کامل ربات رو بسازی به صورت زیر: تعاریف: استف = کسی که رنک ادمینیش 0 نباشه در واقع 1 تا 11 در دکمه ایجاد تیکت جدید لیستی به صورت دکمه شیشه ای از کتگوری ها بیاره که کاربر بتونه باز کنه ولی استف نتونه تیکت باز کنه وقتی میزنه تیکت باز شه ازش موضوع تیکت رو بپرسه بعد از این که موضوع رو داد تیکت باز شه و وقتی تیکت باز میشه برای رنک مربوطه پیام بره رنک مربوطه میشه required_rank که در categories هست اون عدد هرچی بود به همه افراد بالا تر از اون و خود اون رنک پیام بره پیامی که میره شامل این دکمه ها زیرش باشه: مشاهده تیکت پاسخ به تیکت بستن تیکت بعد از این که تیکت باز شد کاربر بتونه هر چیزی ارسال کنه تا وقتی دستور /cancel رو بزنه و از حالت تیکت خارج شه و InTicket از آیدی تیکت به 0 تغییر کنه و دیگه پیام هاش به تیکت اضافه نشه وقتی تیکت رو کسی مشاهده میکنه تمام پیام هایی که تیکت داره رو براش ارسال کنه پاسخ به تیکت هم همینطور وقتی استفی به تیکت پاسخ میده هم بره جزو پیام های تیکت به عنوان پاسخ استف * فقط اسم اکانت تلگرام فرد استف نشان داده شه پنل مدیریت(به صورت دکمه شیشه ای) که برای استف هست به صورت زیر باشه: سیستمی برای آمار باشه که کاربران کل، تیکت‌های کل، تیکت‌های باز، تیکت‌های بسته، پرسنل رو نشون بده مدیریت تیکت ها وجود داشته باشه که وقتی میره توش به صورت دکمه کیبوردی لیستی از همه تیکت ها بیاره و صفحه ای باشه تیکت های پاسخ داده نشده اول باشن لیست فیلتر داشته باشه بشه چیزی که میخوایمو پیدا کنیم و خب وقتی روی تیکتی میزنیم دکمه های بیاد و ... مشاهده تیکت پاسخ به تیکت بستن/باز تیکت فقط تیکت هایی که بهش دسترسی داره رو نشونش بده مدیریت دسته بندی ها داشته باشیم که بشه توش دسته بندی اضافه کرد رنکاشو تنظیم کرد و... تنظیمات ربات باشه که بشه توش bot_status start_text spam_time spam_limit و... رو مدیریت کرد بخشی برای مدیریت کاربران باشه برای دیدن لیست کاربران باشه به صورت فایل txt بده بهش که توش اطلاعاتی باشه بشه بن کرد آن بن کرد لیست بنو دید رنک ادمینی ست کرد دسترسی ها به صورت زیر باشه: رنک 1 تا 6: آمار، مدیریت تیکت ها رنک 8: آمار، مدیریت تیکت ها، لیست بن، بن، آن بن رنک ادمینی تا 6 رو بتونه بده رنک 9: همه چیز فقط رنک ادمینی تا 8 رو بتونه بده رنک 10: همه چیز فقط رنک ادمینی تا 9 رو بتونه بده رنک 11: دسترسی کامل به همه چیز یه سری جا ها میبینی نیاز به کش کردن یه سری چیز ها داری میتونی فایل ایجاد کنی تو پوشه data به آیدی کاربر که ازش استفاده کنی کد کامل تو کد کامنت نزار