Spaces:
Sleeping
Sleeping
from html import escape | |
from secrets import choice | |
from pyrogram import enums, filters | |
from pyrogram.enums import ChatMemberStatus as CMS | |
from pyrogram.errors import ChatAdminRequired, RPCError | |
from pyrogram.types import ChatMemberUpdated, InlineKeyboardMarkup, Message | |
from Powers import DEV_USERS | |
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() | |
ChatType = enums.ChatType | |
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 != ChatType.PRIVATE | |
else escape(user.first_name), | |
id=user.id, | |
) | |
else: | |
teks = "" | |
return teks | |
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 | |
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 | |
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 | |
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"<code>{m.text}</code>\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 | |
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"<code>{m.text}</code>\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 | |
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 | |
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 | |
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 | |
async def member_has_joined(c: Gojo, member: ChatMemberUpdated): | |
if ( | |
member.new_chat_member | |
and member.new_chat_member.status not in {CMS.BANNED, CMS.LEFT, CMS.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 in DEV_USERS: | |
await c.send_animation( | |
chat_id=member.chat.id, | |
animation="./extras/william.gif", | |
caption="😳 My **DEV** 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.id)) | |
except RPCError as e: | |
print(e) | |
return | |
else: | |
return | |
async def member_has_left(c: Gojo, member: ChatMemberUpdated): | |
if ( | |
not member.new_chat_member | |
and member.old_chat_member.status not in {CMS.BANNED, CMS.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 in DEV_USERS: | |
await c.send_message( | |
member.chat.id, | |
"Will miss you master :(", | |
) | |
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.id)) | |
return | |
except RPCError as e: | |
print(e) | |
return | |
else: | |
return | |
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("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 | |
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("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"] | |
__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 <reply> : Sets a custom welcome message. | |
• /setgoodbye <reply> : Sets a custom goodbye message. | |
• /resetwelcome : Resets to bot default welcome message. | |
• /resetgoodbye : Resets to bot default goodbye message. | |
• /welcome <on/off> | noformat : enable/disable | Shows the current welcome message | settings. | |
• /goodbye <on/off> | noformat : enable/disable | Shows the current goodbye message | settings. | |
• /cleanwelcome <on/off> : Shows or sets the current clean welcome settings. | |
• /cleangoodbye <on/off> : Shows or sets the current clean goodbye settings. | |
**Cleaner:** | |
• /cleanservice <on/off> : Use it to clean all service messages automatically or to view current status. | |
**Format** | |
Check /markdownhelp for help related to formatting!""" | |