mytelegrambot / bot.py
tharuka1234's picture
Upload 2 files
5aa1f91 verified
Raw
History Blame Contribute Delete
10.1 kB
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 එක හැසිරවීම
@bot.message_handler(commands=['start'])
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 හැසිරවීම
@bot.callback_query_handler(func=lambda call: call.data == "check_sub")
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)
@bot.message_handler(commands=['stats'])
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)
@bot.message_handler(commands=['broadcast'])
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()