from html import escape from secrets import choice from pyrogram import filters from pyrogram.errors import ChatAdminRequired, RPCError from pyrogram.types import ChatMemberUpdated, InlineKeyboardMarkup, Message from Powers import OWNER_ID from Powers.bot_class import Gojo from Powers.database.antispam_db import GBan from Powers.database.greetings_db import Greetings from Powers.utils.custom_filters import admin_filter, bot_admin_filter, command from Powers.utils.msg_types import Types, get_wlcm_type from Powers.utils.parser import escape_markdown, mention_html from Powers.utils.string import ( build_keyboard, escape_invalid_curly_brackets, parse_button, ) from Powers.vars import Config # Initialize gdb = GBan() async def escape_mentions_using_curly_brackets_wl( m: ChatMemberUpdated, n: bool, text: str, parse_words: list, ) -> str: teks = await escape_invalid_curly_brackets(text, parse_words) if n: user = m.new_chat_member.user if m.new_chat_member else m.from_user else: user = m.old_chat_member.user if m.old_chat_member else m.from_user if teks: teks = teks.format( first=escape(user.first_name), last=escape(user.last_name or user.first_name), fullname=" ".join( [ escape(user.first_name), escape(user.last_name), ] if user.last_name else [escape(user.first_name)], ), username=( "@" + (await escape_markdown(escape(user.username))) if user.username else (await (mention_html(escape(user.first_name), user.id))) ), mention=await (mention_html(escape(user.first_name), user.id)), chatname=escape(m.chat.title) if m.chat.type != "private" else escape(user.first_name), id=user.id, ) else: teks = "" return teks @Gojo.on_message(command("cleanwelcome") & admin_filter) async def cleanwlcm(_, m: Message): db = Greetings(m.chat.id) status = db.get_current_cleanwelcome_settings() args = m.text.split(" ", 1) if len(args) >= 2: if args[1].lower() == "on": db.set_current_cleanwelcome_settings(True) await m.reply_text("Turned on!") return if args[1].lower() == "off": db.set_current_cleanwelcome_settings(False) await m.reply_text("Turned off!") return await m.reply_text("what are you trying to do ??") return await m.reply_text(f"Current settings:- {status}") return @Gojo.on_message(command("cleangoodbye") & admin_filter) async def cleangdbye(_, m: Message): db = Greetings(m.chat.id) status = db.get_current_cleangoodbye_settings() args = m.text.split(" ", 1) if len(args) >= 2: if args[1].lower() == "on": db.set_current_cleangoodbye_settings(True) await m.reply_text("Turned on!") return if args[1].lower() == "off": db.set_current_cleangoodbye_settings(False) await m.reply_text("Turned off!") return await m.reply_text("what are you trying to do ??") return await m.reply_text(f"Current settings:- {status}") return @Gojo.on_message(command("cleanservice") & admin_filter) async def cleanservice(_, m: Message): db = Greetings(m.chat.id) status = db.get_current_cleanservice_settings() args = m.text.split(" ", 1) if len(args) >= 2: if args[1].lower() == "on": db.set_current_cleanservice_settings(True) await m.reply_text("Turned on!") return if args[1].lower() == "off": db.set_current_cleanservice_settings(False) await m.reply_text("Turned off!") return await m.reply_text("what are you trying to do ??") return await m.reply_text(f"Current settings:- {status}") return @Gojo.on_message(command("setwelcome") & admin_filter & bot_admin_filter) async def save_wlcm(_, m: Message): db = Greetings(m.chat.id) if m and not m.from_user: return args = m.text.split(None, 1) if len(args) >= 4096: await m.reply_text( "Word limit exceed !!", ) return if not (m.reply_to_message and m.reply_to_message.text) and len(m.command) == 0: await m.reply_text( "Error: There is no text in here! and only text with buttons are supported currently !", ) return text, msgtype, _ = await get_wlcm_type(m) if not m.reply_to_message and msgtype == Types.TEXT and len(m.command) <= 2: await m.reply_text(f"{m.text}\n\nError: There is no data in here!") return if not text and not msgtype: await m.reply_text( "Please provide some data!", ) return if not msgtype: await m.reply_text("Please provide some data for this to reply with!") return db.set_welcome_text(text) await m.reply_text("Saved welcome!") return @Gojo.on_message(command("setgoodbye") & admin_filter & bot_admin_filter) async def save_gdbye(_, m: Message): db = Greetings(m.chat.id) if m and not m.from_user: return args = m.text.split(None, 1) if len(args) >= 4096: await m.reply_text( "Word limit exceeds !!", ) return if not (m.reply_to_message and m.reply_to_message.text) and len(m.command) == 0: await m.reply_text( "Error: There is no text in here! and only text with buttons are supported currently !", ) return text, msgtype, _ = await get_wlcm_type(m) if not m.reply_to_message and msgtype == Types.TEXT and len(m.command) <= 2: await m.reply_text(f"{m.text}\n\nError: There is no data in here!") return if not text and not msgtype: await m.reply_text( "Please provide some data!", ) return if not msgtype: await m.reply_text("Please provide some data for this to reply with!") return db.set_goodbye_text(text) await m.reply_text("Saved goodbye!") return @Gojo.on_message(command("resetgoodbye") & admin_filter & bot_admin_filter) async def resetgb(_, m: Message): db = Greetings(m.chat.id) if m and not m.from_user: return text = "Sad to see you leaving {first}.\nTake Care!" db.set_goodbye_text(text) await m.reply_text("Ok Done!") return @Gojo.on_message(command("resetwelcome") & admin_filter & bot_admin_filter) async def resetwlcm(_, m: Message): db = Greetings(m.chat.id) if m and not m.from_user: return text = "Hey {first}, welcome to {chatname}!" db.set_welcome_text(text) await m.reply_text("Done!") return @Gojo.on_message(filters.service & filters.group, group=59) async def cleannnnn(_, m: Message): db = Greetings(m.chat.id) clean = db.get_current_cleanservice_settings() try: if clean: await m.delete() except Exception: pass @Gojo.on_chat_member_updated(filters.group, group=69) async def member_has_joined(c: Gojo, member: ChatMemberUpdated): if ( member.new_chat_member and member.new_chat_member.status not in {"banned", "left", "restricted"} and not member.old_chat_member ): pass else: return user = member.new_chat_member.user if member.new_chat_member else member.from_user db = Greetings(member.chat.id) banned_users = gdb.check_gban(user.id) try: if user.id == Config.BOT_ID: return if user.id == OWNER_ID: await c.send_message( member.chat.id, "Wew My Owner has also joined the chat!", ) return if banned_users: await member.chat.ban_member(user.id) await c.send_message( member.chat.id, f"{user.mention} was globally banned so i banned!", ) return if user.is_bot: return # ignore bots except ChatAdminRequired: return status = db.get_welcome_status() oo = db.get_welcome_text() parse_words = [ "first", "last", "fullname", "username", "mention", "id", "chatname", ] hmm = await escape_mentions_using_curly_brackets_wl(member, True, oo, parse_words) if status: tek, button = await parse_button(hmm) button = await build_keyboard(button) button = InlineKeyboardMarkup(button) if button else None if "%%%" in tek: filter_reply = tek.split("%%%") teks = choice(filter_reply) else: teks = tek ifff = db.get_current_cleanwelcome_id() gg = db.get_current_cleanwelcome_settings() if ifff and gg: try: await c.delete_messages(member.chat.id, int(ifff)) except RPCError: pass try: jj = await c.send_message( member.chat.id, text=teks, reply_markup=button, disable_web_page_preview=True, ) if jj: db.set_cleanwlcm_id(int(jj.message_id)) except RPCError as e: print(e) return else: return @Gojo.on_chat_member_updated(filters.group, group=99) async def member_has_left(c: Gojo, member: ChatMemberUpdated): if ( not member.new_chat_member and member.old_chat_member.status not in {"banned", "restricted"} and member.old_chat_member ): pass else: return db = Greetings(member.chat.id) status = db.get_goodbye_status() oo = db.get_goodbye_text() parse_words = [ "first", "last", "fullname", "id", "username", "mention", "chatname", ] user = member.old_chat_member.user if member.old_chat_member else member.from_user hmm = await escape_mentions_using_curly_brackets_wl(member, False, oo, parse_words) if status: tek, button = await parse_button(hmm) button = await build_keyboard(button) button = InlineKeyboardMarkup(button) if button else None if "%%%" in tek: filter_reply = tek.split("%%%") teks = choice(filter_reply) else: teks = tek ifff = db.get_current_cleangoodbye_id() iii = db.get_current_cleangoodbye_settings() if ifff and iii: try: await c.delete_messages(member.chat.id, int(ifff)) except RPCError: pass if user.id == OWNER_ID: await c.send_message( member.chat.id, "Will miss you :)", ) return try: ooo = await c.send_message( member.chat.id, text=teks, reply_markup=button, disable_web_page_preview=True, ) if ooo: db.set_cleangoodbye_id(int(ooo.message_id)) return except RPCError as e: print(e) return else: return @Gojo.on_message(command("welcome") & admin_filter) async def welcome(c: Gojo, m: Message): db = Greetings(m.chat.id) status = db.get_welcome_status() oo = db.get_welcome_text() args = m.text.split(" ", 1) if m and not m.from_user: return if len(args) >= 2: if args[1].lower() == "noformat": await m.reply_text( f"""Current welcome settings:- Welcome power: {status} Clean Welcome: {db.get_current_cleanwelcome_settings()} Cleaning service: {db.get_current_cleanservice_settings()} Welcome text in no formating: """, ) await c.send_message(m.chat.id, text=oo, parse_mode=None) return if args[1].lower() == "on": db.set_current_welcome_settings(True) await m.reply_text("Turned on!") return if args[1].lower() == "off": db.set_current_welcome_settings(False) await m.reply_text("Turned off!") return await m.reply_text("what are you trying to do ??") return await m.reply_text( f"""Current welcome settings:- Welcome power: {status} Clean Welcome: {db.get_current_cleanwelcome_settings()} Cleaning service: {db.get_current_cleanservice_settings()} Welcome text: """, ) tek, button = await parse_button(oo) button = await build_keyboard(button) button = InlineKeyboardMarkup(button) if button else None await c.send_message(m.chat.id, text=tek, reply_markup=button) return @Gojo.on_message(command("goodbye") & admin_filter) async def goodbye(c: Gojo, m: Message): db = Greetings(m.chat.id) status = db.get_goodbye_status() oo = db.get_goodbye_text() args = m.text.split(" ", 1) if m and not m.from_user: return if len(args) >= 2: if args[1].lower() == "noformat": await m.reply_text( f"""Current goodbye settings:- Goodbye power: {status} Clean Goodbye: {db.get_current_cleangoodbye_settings()} Cleaning service: {db.get_current_cleanservice_settings()} Goodbye text in no formating: """, ) await c.send_message(m.chat.id, text=oo, parse_mode=None) return if args[1].lower() == "on": db.set_current_goodbye_settings(True) await m.reply_text("Turned on!") return if args[1].lower() == "off": db.set_current_goodbye_settings(False) await m.reply_text("Turned off!") return await m.reply_text("what are you trying to do ??") return await m.reply_text( f"""Current Goodbye settings:- Goodbye power: {status} Clean Goodbye: {db.get_current_cleangoodbye_settings()} Cleaning service: {db.get_current_cleanservice_settings()} Goodbye text: """, ) tek, button = await parse_button(oo) button = await build_keyboard(button) button = InlineKeyboardMarkup(button) if button else None await c.send_message(m.chat.id, text=tek, reply_markup=button) return __PLUGIN__ = "greetings" __alt_name__ = ["welcome", "goodbye", "cleanservice"]