Spaces:
Running
Running
| import os | |
| import telebot | |
| from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton | |
| from pymongo import MongoClient | |
| # ===================================================================== | |
| # ⚙️ Configurations (ඔබගේ විස්තර මෙතැනට ඇතුළත් කරන්න) | |
| # ===================================================================== | |
| BOT_TOKEN = "8355828613:AAEA1d4TxAQu9bhzOwQuVhvJnsl1V35TYgI" | |
| VIDEO_FILE_ID = "BAACAgUAAxkBAAMPanq94M3zh7wx4NxvguC-nd6ii68AAqQmAAJ6pdlXaSBhm38xWj89BA" | |
| ADMIN_ID = 6858847099 # ඔබගේ නිවැරදි Telegram ID එක (ඉලක්කම් පමණි) | |
| # --- චැනල් එක Public ද Private ද යන්න මෙතැනින් තෝරන්න --- | |
| IS_PRIVATE_CHANNEL = False # Private චැනල් එකක් නම් True කරන්න. Public නම් False කරන්න. | |
| CHANNEL_TARGET = "valaththahouse" # චැනල් එකේ Username එක (Public නම්) හෝ ID එක (Private නම්) | |
| # 🌐 MongoDB Cloud Connection ලින්ක් එක මෙතැනට දමන්න | |
| MONGO_URI = "mongodb+srv://niriellagedilrukshi_db_user:ZD3easLLhGGB0HuN@cluster0.n2d8wxh.mongodb.net/?appName=Cluster0" | |
| # ===================================================================== | |
| bot = telebot.TeleBot(BOT_TOKEN) | |
| # 🏛️ MongoDB Database එක සම්බන්ධ කිරීම | |
| try: | |
| mongo_client = MongoClient(MONGO_URI) | |
| db = mongo_client["telegram_bot_db"] # Database එකේ නම | |
| db_users = db["users"] # Table (Collection) එකේ නම | |
| print("✅ MongoDB Cloud Database එක සාර්ථකව සම්බන්ධ වුණා!") | |
| except Exception as e: | |
| print(f"❌ Database Connection Error: {e}") | |
| # 1. Force Subscribe පරීක්ෂා කිරීමේ සහ Join Button එක සාදන ශ්රිතය | |
| def check_user_status(message): | |
| user_id = message.from_user.id | |
| try: | |
| if IS_PRIVATE_CHANNEL: | |
| chat_check_target = int(f"-100{CHANNEL_TARGET}") | |
| else: | |
| chat_check_target = f"@{CHANNEL_TARGET}" | |
| member = bot.get_chat_member(chat_check_target, user_id) | |
| if member.status in ['member', 'administrator', 'creator']: | |
| return True | |
| except Exception as e: | |
| print(f"Error checking status: {e}") | |
| pass | |
| if IS_PRIVATE_CHANNEL: | |
| channel_link = f"https://t.me/{CHANNEL_TARGET}" | |
| else: | |
| channel_link = f"https://t.me/{CHANNEL_TARGET}" | |
| join_button = InlineKeyboardMarkup() | |
| join_button.add(InlineKeyboardButton("📢 Channel එකට Join වෙන්න", url=channel_link)) | |
| join_button.add(InlineKeyboardButton("🔄 මම Join වුණා (Check)", callback_data="check_sub")) | |
| bot.send_message( | |
| message.chat.id, | |
| "⚠️ ඉදිරියට යෑමට නම් ඔබ අපගේ නිල Channel එකට අනිවාර්යයෙන්ම Join විය යුතුය!", | |
| reply_markup=join_button | |
| ) | |
| return False | |
| # 2. User ගේ වත්මන් තත්ත්වය පෙන්වන Dashboard එක | |
| def show_dashboard(chat_id, user_id): | |
| user = db_users.find_one({"user_id": user_id}) | |
| invites = user.get("invite_count", 0) if user else 0 | |
| bot_username = bot.get_me().username | |
| ref_link = f"https://t.me/{bot_username}?start={user_id}" | |
| if invites >= 3: | |
| bot.send_message(chat_id, "🎉 සුභ පැතුම්! ඔබ සාර්ථකව මිතුරන් 3 දෙනෙකු Invite කර ඇත. මෙන්න ඔබ ඉල්ලූ වීඩියෝව:") | |
| bot.send_video(chat_id, VIDEO_FILE_ID) | |
| else: | |
| msg_text = ( | |
| f"👋 සාදරයෙන් පිළිගනිමු!\n\n" | |
| f"🎬 මෙම වීඩියෝව ලබා ගැනීමට නම් ඔබ තව මිතුරන් **{3 - invites} දෙනෙකු** Invite කළ යුතුය.\n\n" | |
| f"📊 ඔබගේ වත්මන් Invites ගණන: {invites}/3\n\n" | |
| f"🔗 ඔබගේ විශේෂ Invite Link එක පහතින් ලබාගෙන මිතුරන් අතර Share කරන්න:" | |
| ) | |
| share_button = InlineKeyboardMarkup() | |
| share_url = f"https://t.me/share/url?url={ref_link}&text=මේ%20Bot%20එකෙන්%20නියම%20වීඩියෝ%20එකක්%20දෙනවා!%20දැන්ම%20බලන්න." | |
| share_button.add(InlineKeyboardButton("🔗 ලින්ක් එක Share කරන්න", url=share_url)) | |
| bot.send_message(chat_id, msg_text, reply_markup=share_button) | |
| # 3. Start Command එක හැසිරවීම | |
| def start_command(message): | |
| user_id = message.from_user.id | |
| user_name = message.from_user.first_name | |
| text = message.text | |
| # MongoDB එකේ දැනටමත් මේ User ඉන්නවාදැයි පරීක්ෂා කිරීම | |
| is_user_exists = db_users.find_one({"user_id": user_id}) | |
| if not is_user_exists: | |
| referred_by = None | |
| # ලින්ක් එකකින් ආපු කෙනෙක්ද (Referral) කියා බැලීම | |
| if len(text.split()) > 1: | |
| possible_referrer = text.split()[1] | |
| if possible_referrer.isdigit(): | |
| referrer_id = int(possible_referrer) | |
| if referrer_id != user_id: | |
| # Invite කළ කෙනා ඇත්තටම අපේ Database එකේ ඉන්නවාදැයි බැලීම | |
| if db_users.find_one({"user_id": referrer_id}): | |
| referred_by = referrer_id | |
| # 🆕 අලුත් User ව MongoDB එකට සේව් කිරීම | |
| db_users.insert_one({ | |
| "user_id": user_id, | |
| "name": user_name, | |
| "referred_by": referred_by, | |
| "invite_count": 0 | |
| }) | |
| print(f"🆕 අලුත් User කෙනෙක් Cloud Database එකට සේව් වුණා: {user_name} ({user_id})") | |
| # Invite කළ කෙනාට Point එකක් එකතු කර Notification එකක් යැවීම | |
| if referred_by: | |
| db_users.update_one({"user_id": referred_by}, {"$inc": {"invite_count": 1}}) | |
| referrer_data = db_users.find_one({"user_id": referred_by}) | |
| current_invites = referrer_data.get("invite_count", 0) if referrer_data else 0 | |
| try: | |
| bot.send_message( | |
| referred_by, | |
| f"🎉 ඔබගේ ලින්ක් එකෙන් අලුත් සාමාජිකයෙක් ({user_name}) එකතු වුණා!\n" | |
| f"ඔබගේ වත්මන් Invites ගණන: {current_invites}/3" | |
| ) | |
| except Exception: | |
| pass | |
| if not check_user_status(message): | |
| return | |
| show_dashboard(message.chat.id, user_id) | |
| # 4. Callback Query හැසිරවීම | |
| def check_callback(call): | |
| user_id = call.from_user.id | |
| try: | |
| if IS_PRIVATE_CHANNEL: | |
| chat_check_target = int(f"-100{CHANNEL_TARGET}") | |
| else: | |
| chat_check_target = f"@{CHANNEL_TARGET}" | |
| member = bot.get_chat_member(chat_check_target, user_id) | |
| if member.status in ['member', 'administrator', 'creator']: | |
| bot.answer_callback_query(call.id, "✅ ස්තූතියි! ඔබ සාර්ථකව Channel එකට Join වී ඇත.") | |
| bot.delete_message(call.message.chat.id, call.message.message_id) | |
| show_dashboard(call.message.chat.id, user_id) | |
| return | |
| except Exception: | |
| pass | |
| bot.answer_callback_query(call.id, "❌ ඔබ තවමත් Channel එකට Join වී නැත! කරුණාකර Join වී නැවත උත්සාහ කරන්න.", show_alert=True) | |
| # 5. Stats Command (Admin Only) | |
| def get_stats(message): | |
| if message.from_user.id == ADMIN_ID: | |
| total_users = db_users.count_documents({}) | |
| bot.reply_to(message, f"📊 **Bot Statistics:**\n\n👥 Total Users: {total_users}") | |
| # 6. Broadcast Command (Admin Only) | |
| def broadcast_msg(message): | |
| if message.from_user.id == ADMIN_ID: | |
| if not message.reply_to_message: | |
| bot.reply_to(message, "❌ කරුණාකර ඔබ හැමෝටම යැවිය යුතු පණිවිඩයට Reply කරමින් /broadcast ලෙස Type කරන්න.") | |
| return | |
| bot.reply_to(message, "⏳ Broadcast එක ආරම්භ වුණා. මඳක් රැඳී සිටින්න...") | |
| all_users = db_users.find({}, {"user_id": 1}) | |
| success = 0 | |
| failed = 0 | |
| for user in all_users: | |
| try: | |
| bot.copy_message(chat_id=user["user_id"], from_chat_id=message.chat.id, message_id=message.reply_to_message.message_id) | |
| success += 1 | |
| except Exception: | |
| failed += 1 | |
| bot.send_message(message.chat.id, f"📢 **Broadcast එක අවසන්!**\n\n✅ සාර්ථකව ලැබුණා: {success}\n❌ අසාර්ථක වුණා: {failed}") | |
| print("Bot එක සාර්ථකව වැඩ කරමින් පවතී (Telebot + MongoDB)...") | |
| bot.infinity_polling() | |