from html import escape from secrets import choice from traceback import format_exc from typing import List from pyrogram import emoji, enums, filters from pyrogram.errors import ChannelPrivate, ChatAdminRequired, RPCError from pyrogram.types import Message, User from Powers import LOGGER from Powers.bot_class import Gojo from Powers.database.antispam_db import GBan from Powers.database.greetings_db import Greetings from Powers.supports import get_support_staff from Powers.utils.cmd_senders import send_cmd from Powers.utils.custom_filters import (admin_filter, bot_admin_filter, captcha_filter, command) from Powers.utils.kbhelpers import ikb 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) # Initialize gdb = GBan() ChatType = enums.ChatType async def escape_mentions_using_curly_brackets_wl( user: User, m: Message, text: str, parse_words: list, ) -> str: teks = await escape_invalid_curly_brackets(text, parse_words) 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 != ChatType.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, file = 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 file: 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, msgtype, file) 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, file = 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 file: 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, msgtype, file) 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, None) 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, None) 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_message(filters.group & filters.new_chat_members & ~captcha_filter, group=69) async def member_has_joined(c: Gojo, m: Message): users: List[User] = m.new_chat_members db = Greetings(m.chat.id) for user in users: banned_users = gdb.check_gban(user.id) try: if user.id == c.me.id: continue if user.id in get_support_staff("dev"): await c.send_animation( chat_id=m.chat.id, animation="./extras/william.gif", caption=f"😳 My **DEV** {user.mention} has also joined the chat!", ) continue if banned_users: await m.chat.ban_member(user.id) await c.send_message( m.chat.id, f"{user.mention} was globally banned so i banned!", ) continue if user.is_bot: continue # ignore bots except ChatAdminRequired: continue status = db.get_welcome_status() oo = db.get_welcome_text() UwU = db.get_welcome_media() mtype = db.get_welcome_msgtype() parse_words = [ "first", "last", "fullname", "username", "mention", "id", "chatname", ] hmm = await escape_mentions_using_curly_brackets_wl(user, m, oo, parse_words) if not status: continue tek, button = await parse_button(hmm) button = await build_keyboard(button) button = ikb(button) if button else None if "%%%" in tek: filter_reply = tek.split("%%%") teks = choice(filter_reply) else: teks = tek if not teks: teks = f"A wild {user.mention} appeared in {m.chat.title}! Everyone be aware." ifff = db.get_current_cleanwelcome_id() gg = db.get_current_cleanwelcome_settings() if ifff and gg: try: await c.delete_messages(m.chat.id, int(ifff)) except RPCError: pass if not teks: teks = "Hey {first}, welcome to {chatname}" try: if not UwU: jj = await c.send_message( m.chat.id, text=teks, reply_markup=button, disable_web_page_preview=True, ) else: jj = await (await send_cmd(c, mtype))( m.chat.id, UwU, caption=teks, reply_markup=button, ) if jj: db.set_cleanwlcm_id(int(jj.id)) except ChannelPrivate: continue except RPCError as e: LOGGER.error(e) LOGGER.error(format_exc(e)) @Gojo.on_message(filters.group & filters.left_chat_member, group=99) async def member_has_left(c: Gojo, m: Message): db = Greetings(m.chat.id) status = db.get_goodbye_status() oo = db.get_goodbye_text() UwU = db.get_goodbye_media() mtype = db.get_goodbye_msgtype() parse_words = [ "first", "last", "fullname", "id", "username", "mention", "chatname", ] user = m.left_chat_member or m.from_user hmm = await escape_mentions_using_curly_brackets_wl(user, m, oo, parse_words) if not status: return tek, button = await parse_button(hmm) button = await build_keyboard(button) button = ikb(button) if button else None if "%%%" in tek: filter_reply = tek.split("%%%") teks = choice(filter_reply) else: teks = tek if not teks: # Just in case teks = f"Thanks for being part of this group {user.mention}. But I don't like your arrogance and leaving the group {emoji.EYES}" ifff = db.get_current_cleangoodbye_id() iii = db.get_current_cleangoodbye_settings() if ifff and iii: try: await c.delete_messages(m.chat.id, int(ifff)) except RPCError: pass if user.id in get_support_staff("dev"): await c.send_message( m.chat.id, f"Will miss you my master {user.mention} :(", ) return if not teks: teks = "Sad to see you leaving {first}\nTake Care!" try: ooo = ( await (await send_cmd(c, mtype))( m.chat.id, UwU, caption=teks, reply_markup=button, ) if UwU else await c.send_message( m.chat.id, text=teks, reply_markup=button, disable_web_page_preview=True, ) ) if ooo: db.set_cleangoodbye_id(int(ooo.id)) return except ChannelPrivate: pass except RPCError as e: LOGGER.error(e) LOGGER.error(format_exc(e)) 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=enums.ParseMode.DISABLED ) return if args[1].lower() == "on": db.set_current_welcome_settings(True) await m.reply_text("I will greet newly joined member from now on.") return if args[1].lower() == "off": db.set_current_welcome_settings(False) await m.reply_text("I will stay quiet when someone joins.") 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: """, ) UwU = db.get_welcome_media() mtype = db.get_welcome_msgtype() tek, button = await parse_button(oo) button = await build_keyboard(button) button = ikb(button) if button else None if not UwU: await c.send_message( m.chat.id, text=tek, reply_markup=button, disable_web_page_preview=True, ) else: await (await send_cmd(c, mtype))( m.chat.id, UwU, caption=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=enums.ParseMode.DISABLED ) return if args[1].lower() == "on": db.set_current_goodbye_settings(True) await m.reply_text("I don't want but I will say goodbye to the fugitives") return if args[1].lower() == "off": db.set_current_goodbye_settings(False) await m.reply_text("I will stay quiet for fugitives") 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: """, ) UwU = db.get_goodbye_media() mtype = db.get_goodbye_msgtype() tek, button = await parse_button(oo) button = await build_keyboard(button) button = ikb(button) if button else None if not UwU: await c.send_message( m.chat.id, text=tek, reply_markup=button, disable_web_page_preview=True, ) else: await (await send_cmd(c, mtype))( m.chat.id, UwU, caption=tek, reply_markup=button, ) return __PLUGIN__ = "greetings" __alt_name__ = ["welcome", "goodbye", "cleanservice"] __HELP__ = """ **Greetings** Customize your group's welcome / goodbye messages that can be personalised in multiple ways. **Note:** × Currently it supports only text! × Gojo must be an admin to greet and goodbye users. **Admin Commands:** • /setwelcome : Sets a custom welcome message. • /setgoodbye : Sets a custom goodbye message. • /resetwelcome : Resets to bot default welcome message. • /resetgoodbye : Resets to bot default goodbye message. • /welcome | noformat : enable/disable | Shows the current welcome message | settings. • /goodbye | noformat : enable/disable | Shows the current goodbye message | settings. • /cleanwelcome : Shows or sets the current clean welcome settings. • /cleangoodbye : Shows or sets the current clean goodbye settings. **Cleaner:** • /cleanservice : Use it to clean all service messages automatically or to view current status. **Format** Check /markdownhelp for help related to formatting!"""