import time from collections import defaultdict from telegram import ( Update, InlineKeyboardButton, InlineKeyboardMarkup, ChatPermissions ) from telegram.ext import ( ApplicationBuilder, CommandHandler, CallbackQueryHandler, MessageHandler, ContextTypes, filters ) BOT_TOKEN = "8466869658:AAF1QwBrpZ8b3Il-OOkU3a-171CrUeTWInM" # ================== MEMORY ================== GROUPS = {} FLOOD = defaultdict(list) # ================== HELPERS ================== async def is_admin(uid, chat_id, context): m = await context.bot.get_chat_member(chat_id, uid) return m.status in ("administrator", "creator") def get_group(chat): GROUPS.setdefault(chat.id, { "name": chat.title, "antispam": True, "antiflood": True, "welcome": True, "captcha": True, "link": False, "warn": True, "warns": {} }) return GROUPS[chat.id] # ================== SETTINGS KEYBOARD ================== def main_settings_kb(data): def st(x): return "ON ✅" if x else "OFF ❌" return InlineKeyboardMarkup([ [ InlineKeyboardButton("📜 Regulation", callback_data="regulation"), InlineKeyboardButton(f"✉️ Anti-Spam {st(data['antispam'])}", callback_data="antispam") ], [ InlineKeyboardButton(f"💬 Welcome {st(data['welcome'])}", callback_data="welcome"), InlineKeyboardButton(f"🌊 Anti-Flood {st(data['antiflood'])}", callback_data="antiflood") ], [ InlineKeyboardButton(f"🧠 Captcha {st(data['captcha'])}", callback_data="captcha"), InlineKeyboardButton(f"🔗 Link {st(data['link'])}", callback_data="link") ], [ InlineKeyboardButton(f"🚨 Warns {st(data['warn'])}", callback_data="warn"), InlineKeyboardButton("🚫 Blocks", callback_data="blocks") ], [ InlineKeyboardButton("🌙 Night", callback_data="night"), InlineKeyboardButton("🌍 Lang", callback_data="lang") ], [ InlineKeyboardButton("⬅ Back", callback_data="back"), InlineKeyboardButton("❌ Close", callback_data="close") ] ]) # ================== START ================== async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): if update.effective_chat.type == "private": await update.message.reply_text( "🛡 **Group Manager Bot**\n\n" "Add me to group & make me admin.\n" "Use /settings in group.", parse_mode="Markdown" ) # ================== SETTINGS ================== async def settings(update: Update, context: ContextTypes.DEFAULT_TYPE): chat = update.effective_chat if chat.type == "private": return if not await is_admin(update.effective_user.id, chat.id, context): return await update.message.reply_text("❌ Admin only") data = get_group(chat) await update.message.reply_text( f"⚙️ **SETTINGS**\nGroup: `{data['name']}`\n\nSelect option:", parse_mode="Markdown", reply_markup=main_settings_kb(data) ) # ================== BUTTON HANDLER ================== async def settings_buttons(update: Update, context: ContextTypes.DEFAULT_TYPE): q = update.callback_query chat = q.message.chat data = get_group(chat) if q.data == "close": return await q.edit_message_text("✅ Settings closed") if q.data == "back": return await q.edit_message_text( f"⚙️ **SETTINGS**\nGroup: `{data['name']}`", parse_mode="Markdown", reply_markup=main_settings_kb(data) ) # -------- TOGGLES -------- if q.data in data and isinstance(data[q.data], bool): data[q.data] = not data[q.data] return await q.edit_message_reply_markup( reply_markup=main_settings_kb(data) ) # -------- INFO / PLACEHOLDERS -------- info = { "regulation": "📜 **Regulation**\nSet your group rules here.", "blocks": "🚫 **Blocks**\nWord & media blocking (coming soon).", "night": "🌙 **Night Mode**\nAuto mute at night (coming soon).", "lang": "🌍 **Language**\nMulti-language support soon." } if q.data in info: return await q.edit_message_text( info[q.data], parse_mode="Markdown", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("⬅ Back", callback_data="back")] ]) ) # ================== WELCOME ================== async def welcome(update: Update, context: ContextTypes.DEFAULT_TYPE): chat = update.effective_chat data = get_group(chat) if not data["welcome"]: return for u in update.message.new_chat_members: if u.is_bot: continue if data["captcha"]: await context.bot.restrict_chat_member( chat.id, u.id, ChatPermissions(can_send_messages=False) ) await context.bot.send_message( chat.id, f"👋 Welcome **{u.first_name}**\nClick verify to chat.", parse_mode="Markdown", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("✅ Verify", callback_data=f"verify_{u.id}")] ]) ) else: await context.bot.send_message( chat.id, f"👋 Welcome **{u.first_name}**", parse_mode="Markdown" ) async def verify(update: Update, context: ContextTypes.DEFAULT_TYPE): q = update.callback_query uid = int(q.data.split("_")[1]) if q.from_user.id != uid: return await q.answer("Not for you", show_alert=True) await context.bot.restrict_chat_member( q.message.chat.id, uid, ChatPermissions(can_send_messages=True) ) await q.edit_message_text("✅ Verified!") # ================== WARN SYSTEM ================== async def warn(update: Update, context: ContextTypes.DEFAULT_TYPE): chat = update.effective_chat data = get_group(chat) if not data["warn"]: return if not await is_admin(update.effective_user.id, chat.id, context): return if not update.message.reply_to_message: return user = update.message.reply_to_message.from_user w = data["warns"].get(user.id, 0) + 1 data["warns"][user.id] = w if w >= 3: await context.bot.restrict_chat_member( chat.id, user.id, ChatPermissions(can_send_messages=False), until_date=int(time.time()) + 1800 ) data["warns"][user.id] = 0 await update.message.reply_text( f"🔇 **{user.first_name} muted (3 warnings)**", parse_mode="Markdown" ) else: await update.message.reply_text( f"⚠️ Warning {w}/3 to {user.first_name}", parse_mode="Markdown" ) # ================== MAIN ================== def main(): app = ApplicationBuilder().token(BOT_TOKEN).build() app.add_handler(CommandHandler("start", start)) app.add_handler(CommandHandler("settings", settings)) app.add_handler(CommandHandler("warn", warn)) app.add_handler(CallbackQueryHandler(settings_buttons)) app.add_handler(CallbackQueryHandler(verify, pattern="verify_")) app.add_handler(MessageHandler(filters.StatusUpdate.NEW_CHAT_MEMBERS, welcome)) print("✅ All buttons working bot running") app.run_polling() if __name__ == "__main__": main()