From 12b7eb0d4319efd870b477e49bb815bb7f697a32 Mon Sep 17 00:00:00 2001 From: yasir Date: Sun, 1 Jan 2023 20:57:47 +0700 Subject: [PATCH] Temp fix --- misskaty/core/decorator/errors.py | 8 +- misskaty/core/message_utils.py | 0 misskaty/plugins/admin.py | 213 ++++++++++++++++++++---------- misskaty/plugins/genss.py | 40 ++++-- misskaty/plugins/grup_tools.py | 2 +- misskaty/plugins/mediainfo.py | 11 +- misskaty/plugins/misc_tools.py | 26 +++- 7 files changed, 214 insertions(+), 86 deletions(-) create mode 100644 misskaty/core/message_utils.py diff --git a/misskaty/core/decorator/errors.py b/misskaty/core/decorator/errors.py index bd7d6650..77c20b0a 100644 --- a/misskaty/core/decorator/errors.py +++ b/misskaty/core/decorator/errors.py @@ -1,6 +1,7 @@ import traceback, asyncio from functools import wraps from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden +from pyrogram.errors.exceptions.flood_420 import FloodWait from misskaty.vars import LOG_CHANNEL from misskaty import app @@ -52,8 +53,11 @@ def capture_err(func): ) for x in error_feedback: - await app.send_message(LOG_CHANNEL, x) - await message.reply(x) + try: + await app.send_message(LOG_CHANNEL, x) + await message.reply(x) + except FloodWait as e: + await asyncio.sleep(x.value) raise err return capture diff --git a/misskaty/core/message_utils.py b/misskaty/core/message_utils.py new file mode 100644 index 00000000..e69de29b diff --git a/misskaty/plugins/admin.py b/misskaty/plugins/admin.py index 02f1fd42..7e059e94 100644 --- a/misskaty/plugins/admin.py +++ b/misskaty/plugins/admin.py @@ -57,36 +57,44 @@ __HELP__ = """ @app.on_chat_member_updated() async def admin_cache_func(_, cmu): if cmu.old_chat_member and cmu.old_chat_member.promoted_by: - admins_in_chat[cmu.chat.id] = { - "last_updated_at": time(), - "data": [member.user.id async for member in app.get_chat_members(cmu.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS)], - } - LOGGER.info(f"Updated admin cache for {cmu.chat.id} [{cmu.chat.title}]") + try: + admins_in_chat[cmu.chat.id] = { + "last_updated_at": time(), + "data": [ + member.user.id + async for member in app.get_chat_members( + cmu.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS + ) + ], + } + LOGGER.info(f"Updated admin cache for {cmu.chat.id} [{cmu.chat.title}]") + except: + pass # Purge CMD @app.on_message(filters.command("purge", COMMAND_HANDLER) & ~filters.private) @adminsOnly("can_delete_messages") async def purge(_, message): - repliedmsg = message.reply_to_message - await message.delete() - - if not repliedmsg: - return await message.reply_text("Reply to a message to purge from.") - - cmd = message.command - if len(cmd) > 1 and cmd[1].isdigit(): - purge_to = repliedmsg.id + int(cmd[1]) - if purge_to > message.id: - purge_to = message.id - else: - purge_to = message.id - - chat_id = message.chat.id - message_ids = [] - del_total = 0 - try: + repliedmsg = message.reply_to_message + await message.delete() + + if not repliedmsg: + return await message.reply_text("Reply to a message to purge from.") + + cmd = message.command + if len(cmd) > 1 and cmd[1].isdigit(): + purge_to = repliedmsg.id + int(cmd[1]) + if purge_to > message.id: + purge_to = message.id + else: + purge_to = message.id + + chat_id = message.chat.id + message_ids = [] + del_total = 0 + for message_id in range( repliedmsg.id, purge_to, @@ -120,11 +128,11 @@ async def purge(_, message): # Kick members @app.on_message(filters.command(["kick", "dkick"], COMMAND_HANDLER) & ~filters.private) @adminsOnly("can_restrict_members") -async def kickFunc(_, message): +async def kickFunc(client, message): user_id, reason = await extract_user_and_reason(message) if not user_id: return await message.reply_text("I can't find that user.") - if user_id == 1507530289: + if user_id == client.me.id: return await message.reply_text("I can't kick myself, i can leave if you want.") if user_id in SUDO: return await message.reply_text("Wow, you wanna kick my owner?") @@ -147,26 +155,37 @@ async def kickFunc(_, message): # Ban/DBan/TBan User -@app.on_message(filters.command(["ban", "dban", "tban"], COMMAND_HANDLER) & ~filters.private) +@app.on_message( + filters.command(["ban", "dban", "tban"], COMMAND_HANDLER) & ~filters.private +) @adminsOnly("can_restrict_members") -async def banFunc(_, message): +async def banFunc(client, message): user_id, reason = await extract_user_and_reason(message, sender_chat=True) if not user_id: return await message.reply_text("I can't find that user.") - if user_id == 1507530289: + if user_id == client.me.id: return await message.reply_text("I can't ban myself, i can leave if you want.") if user_id in SUDO: return await message.reply_text("You Wanna Ban The Elevated One?, RECONSIDER!") if user_id in (await list_admins(message.chat.id)): - return await message.reply_text("I can't ban an admin, You know the rules, so do i.") + return await message.reply_text( + "I can't ban an admin, You know the rules, so do i." + ) try: mention = (await app.get_users(user_id)).mention except IndexError: - mention = message.reply_to_message.sender_chat.title if message.reply_to_message else "Anon" + mention = ( + message.reply_to_message.sender_chat.title + if message.reply_to_message + else "Anon" + ) - msg = f"**Banned User:** {mention}\n" f"**Banned By:** {message.from_user.mention if message.from_user else 'Anon'}\n" + msg = ( + f"**Banned User:** {mention}\n" + f"**Banned By:** {message.from_user.mention if message.from_user else 'Anon'}\n" + ) if message.command[0][0] == "d": await message.reply_to_message.delete() if message.command[0] == "tban": @@ -189,8 +208,11 @@ async def banFunc(_, message): if reason: msg += f"**Reason:** {reason}" keyboard = ikb({"🚨 Unban 🚨": f"unban_{user_id}"}) - await message.chat.ban_member(user_id) - await message.reply_text(msg, reply_markup=keyboard) + try: + await message.chat.ban_member(user_id) + await message.reply_text(msg, reply_markup=keyboard) + except Exception as err: + await message.reply(f"ERROR: {err}") # Unban members @@ -211,34 +233,44 @@ async def unban_func(_, message): elif len(message.command) == 1 and reply: user = message.reply_to_message.from_user.id else: - return await message.reply_text("Provide a username or reply to a user's message to unban.") + return await message.reply_text( + "Provide a username or reply to a user's message to unban." + ) await message.chat.unban_member(user) umention = (await app.get_users(user)).mention await message.reply_text(f"Unbanned! {umention}") # Ban users listed in a message -@app.on_message(filters.user(SUDO) & filters.command("listban", COMMAND_HANDLER) & ~filters.private) +@app.on_message( + filters.user(SUDO) & filters.command("listban", COMMAND_HANDLER) & ~filters.private +) async def list_ban_(c, message): userid, msglink_reason = await extract_user_and_reason(message) if not userid or not msglink_reason: - return await message.reply_text("Provide a userid/username along with message link and reason to list-ban") + return await message.reply_text( + "Provide a userid/username along with message link and reason to list-ban" + ) if len(msglink_reason.split(" ")) == 1: # message link included with the reason return await message.reply_text("You must provide a reason to list-ban") # seperate messge link from reason lreason = msglink_reason.split() messagelink, reason = lreason[0], " ".join(lreason[1:]) - if not re.search(r"(https?://)?t(elegram)?\.me/\w+/\d+", messagelink): # validate link + if not re.search( + r"(https?://)?t(elegram)?\.me/\w+/\d+", messagelink + ): # validate link return await message.reply_text("Invalid message link provided") - if userid == 1507530289: + if userid == c.me.id: return await message.reply_text("I can't ban myself.") if userid in SUDO: return await message.reply_text("You Wanna Ban The Elevated One?, RECONSIDER!") splitted = messagelink.split("/") uname, mid = splitted[-2], int(splitted[-1]) - m = await message.reply_text("`Banning User from multiple groups. This may take some time`") + m = await message.reply_text( + "`Banning User from multiple groups. This may take some time`" + ) try: msgtext = (await app.get_messages(uname, mid)).text gusernames = re.findall("@\w+", msgtext) @@ -267,11 +299,17 @@ async def list_ban_(c, message): # Unban users listed in a message -@app.on_message(filters.user(SUDO) & filters.command("listunban", COMMAND_HANDLER) & ~filters.private) +@app.on_message( + filters.user(SUDO) + & filters.command("listunban", COMMAND_HANDLER) + & ~filters.private +) async def list_unban_(c, message): userid, msglink = await extract_user_and_reason(message) if not userid or not msglink: - return await message.reply_text("Provide a userid/username along with message link to list-unban") + return await message.reply_text( + "Provide a userid/username along with message link to list-unban" + ) if not re.search(r"(https?://)?t(elegram)?\.me/\w+/\d+", msglink): # validate link return await message.reply_text("Invalid message link provided") @@ -313,22 +351,27 @@ async def list_unban_(c, message): async def deleteFunc(_, message): if not message.reply_to_message: return await message.reply_text("Reply To A Message To Delete It") - await message.reply_to_message.delete() - await message.delete() + try: + await message.reply_to_message.delete() + await message.delete() + except: + await message.reply("Please give me delete message permission.") # Promote Members -@app.on_message(filters.command(["promote", "fullpromote"], COMMAND_HANDLER) & ~filters.private) +@app.on_message( + filters.command(["promote", "fullpromote"], COMMAND_HANDLER) & ~filters.private +) @adminsOnly("can_promote_members") async def promoteFunc(_, message): user_id = await extract_user(message) umention = (await app.get_users(user_id)).mention if not user_id: return await message.reply_text("I can't find that user.") - bot = await app.get_chat_member(message.chat.id, 1507530289) - if user_id == 1507530289: + bot = await app.get_chat_member(message.chat.id, client.me.id) + if user_id == client.me.id: return await message.reply_text("I can't promote myself.") - if not bot.can_promote_members: + if not bot.privileges.can_promote_members: return await message.reply_text("I don't have enough permissions") if message.command[0][0] == "f": await message.chat.promote_member( @@ -361,11 +404,11 @@ async def promoteFunc(_, message): # Demote Member @app.on_message(filters.command("demote", COMMAND_HANDLER) & ~filters.private) @adminsOnly("can_promote_members") -async def demote(_, message): +async def demote(client, message): user_id = await extract_user(message) if not user_id: return await message.reply_text("I can't find that user.") - if user_id == 1507530289: + if user_id == client.me.id: return await message.reply_text("I can't demote myself.") if user_id in SUDO: return await message.reply_text("You wanna demote the elevated one?") @@ -413,19 +456,27 @@ async def pin(_, message): # Mute members @app.on_message(filters.command(["mute", "tmute"], COMMAND_HANDLER) & ~filters.private) @adminsOnly("can_restrict_members") -async def mute(_, message): - user_id, reason = await extract_user_and_reason(message) +async def mute(client, message): + try: + user_id, reason = await extract_user_and_reason(message) + except Exception as err: + return await message.reply(f"ERROR: {err}") if not user_id: return await message.reply_text("I can't find that user.") - if user_id == 1507530289: + if user_id == client.me.id: return await message.reply_text("I can't mute myself.") if user_id in SUDO: return await message.reply_text("You wanna mute the elevated one?, RECONSIDER!") if user_id in (await list_admins(message.chat.id)): - return await message.reply_text("I can't mute an admin, You know the rules, so do i.") + return await message.reply_text( + "I can't mute an admin, You know the rules, so do i." + ) mention = (await app.get_users(user_id)).mention keyboard = ikb({"🚨 Unmute 🚨": f"unmute_{user_id}"}) - msg = f"**Muted User:** {mention}\n" f"**Muted By:** {message.from_user.mention if message.from_user else 'Anon'}\n" + msg = ( + f"**Muted User:** {mention}\n" + f"**Muted By:** {message.from_user.mention if message.from_user else 'Anon'}\n" + ) if message.command[0] == "tmute": split = reason.split(None, 1) time_value = split[0] @@ -491,17 +542,19 @@ async def ban_deleted_accounts(_, message): @app.on_message(filters.command(["warn", "dwarn"], COMMAND_HANDLER) & ~filters.private) @adminsOnly("can_restrict_members") -async def warn_user(_, message): +async def warn_user(client, message): user_id, reason = await extract_user_and_reason(message) chat_id = message.chat.id if not user_id: return await message.reply_text("I can't find that user.") - if user_id == 1507530289: + if user_id == client.me.id: return await message.reply_text("I can't warn myself, i can leave if you want.") if user_id in SUDO: return await message.reply_text("You Wanna Warn The Elevated One?, RECONSIDER!") if user_id in (await list_admins(chat_id)): - return await message.reply_text("I can't warn an admin, You know the rules, so do i.") + return await message.reply_text( + "I can't warn an admin, You know the rules, so do i." + ) user, warns = await asyncio.gather( app.get_users(user_id), get_warn(chat_id, await int_to_alpha(user_id)), @@ -534,7 +587,8 @@ async def remove_warning(_, cq): permission = "can_restrict_members" if permission not in permissions: return await cq.answer( - "You don't have enough permissions to perform this action.\n" + f"Permission needed: {permission}", + "You don't have enough permissions to perform this action.\n" + + f"Permission needed: {permission}", show_alert=True, ) user_id = cq.data.split("_")[1] @@ -559,7 +613,8 @@ async def unmute_user(_, cq): permission = "can_restrict_members" if permission not in permissions: return await cq.answer( - "You don't have enough permissions to perform this action.\n" + f"Permission needed: {permission}", + "You don't have enough permissions to perform this action.\n" + + f"Permission needed: {permission}", show_alert=True, ) user_id = cq.data.split("_")[1] @@ -578,7 +633,8 @@ async def unban_user(_, cq): permission = "can_restrict_members" if permission not in permissions: return await cq.answer( - "You don't have enough permissions to perform this action.\n" + f"Permission needed: {permission}", + "You don't have enough permissions to perform this action.\n" + + f"Permission needed: {permission}", show_alert=True, ) user_id = cq.data.split("_")[1] @@ -595,7 +651,9 @@ async def unban_user(_, cq): @adminsOnly("can_restrict_members") async def remove_warnings(_, message): if not message.reply_to_message: - return await message.reply_text("Reply to a message to remove a user's warnings.") + return await message.reply_text( + "Reply to a message to remove a user's warnings." + ) user_id = message.reply_to_message.from_user.id mention = message.reply_to_message.from_user.mention chat_id = message.chat.id @@ -626,7 +684,13 @@ async def check_warns(_, message): # Report User in Group -@app.on_message((filters.command("report", COMMAND_HANDLER) | filters.command(["admins", "admin"], prefixes="@")) & ~filters.private) +@app.on_message( + ( + filters.command("report", COMMAND_HANDLER) + | filters.command(["admins", "admin"], prefixes="@") + ) + & ~filters.private +) @capture_err async def report_user(_, message): if not message.reply_to_message: @@ -641,13 +705,28 @@ async def report_user(_, message): linked_chat = (await app.get_chat(message.chat.id)).linked_chat if linked_chat is None: if reply_id in list_of_admins or reply_id == message.chat.id: - return await message.reply_text("Do you know that the user you are replying is an admin ?") + return await message.reply_text( + "Do you know that the user you are replying is an admin ?" + ) - elif reply_id in list_of_admins or reply_id == message.chat.id or reply_id == linked_chat.id: - return await message.reply_text("Do you know that the user you are replying is an admin ?") - user_mention = reply.from_user.mention if reply.from_user else reply.sender_chat.title + elif ( + reply_id in list_of_admins + or reply_id == message.chat.id + or reply_id == linked_chat.id + ): + return await message.reply_text( + "Do you know that the user you are replying is an admin ?" + ) + user_mention = ( + reply.from_user.mention if reply.from_user else reply.sender_chat.title + ) text = f"Reported {user_mention} to admins!" - admin_data = [m async for m in app.get_chat_members(message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS)] + admin_data = [ + m + async for m in app.get_chat_members( + message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS + ) + ] for admin in admin_data: if admin.user.is_bot or admin.user.is_deleted: # return bots or deleted admins diff --git a/misskaty/plugins/genss.py b/misskaty/plugins/genss.py index 7272a3ef..cfb85835 100644 --- a/misskaty/plugins/genss.py +++ b/misskaty/plugins/genss.py @@ -30,7 +30,19 @@ __HELP__ = """" @app.on_message(filters.command(["genss"], COMMAND_HANDLER)) @capture_err async def genss(client, message): - if message.reply_to_message is not None: + replied = message.reply_to_message + if replied is not None: + media = None + if replied is not None: + vid = [replied.video, replied.document] + for v in vid: + if v is not None: + media = v + break + if media is None: + return await message.reply( + "Reply to a Telegram Video or document as video to generate screenshoot!" + ) process = await message.reply_text("`Processing, please wait..`") c_time = time.time() the_real_download_location = await client.download_media( @@ -52,12 +64,16 @@ async def genss(client, message): chat_id=message.chat.id, message_id=process.id, ) - await client.send_chat_action(chat_id=message.chat.id, action=enums.ChatAction.UPLOAD_PHOTO) + await client.send_chat_action( + chat_id=message.chat.id, action=enums.ChatAction.UPLOAD_PHOTO + ) try: await gather( *[ - message.reply_document(images, reply_to_message_id=message.id), + message.reply_document( + images, reply_to_message_id=message.id + ), message.reply_photo(images, reply_to_message_id=message.id), ] ) @@ -65,7 +81,9 @@ async def genss(client, message): await sleep(e.value) await gather( *[ - message.reply_document(images, reply_to_message_id=message.id), + message.reply_document( + images, reply_to_message_id=message.id + ), message.reply_photo(images, reply_to_message_id=message.id), ] ) @@ -88,7 +106,7 @@ async def genss(client, message): except: pass else: - await message.reply("Reply to a Telegram media to get screenshots..") + await message.reply("Reply to a Telegram media to get screenshots from media..") @app.on_message(filters.command(["genss_link"], COMMAND_HANDLER)) @@ -97,9 +115,13 @@ async def genss_link(client, message): try: link = message.text.split(" ")[1] if link.startswith("https://file.yasirweb.my.id"): - link = link.replace("https://file.yasirweb.my.id", "https://file.yasiraris.workers.dev") + link = link.replace( + "https://file.yasirweb.my.id", "https://file.yasiraris.workers.dev" + ) if link.startswith("https://link.yasirweb.my.id"): - link = link.replace("https://link.yasirweb.my.id", "https://yasirrobot.herokuapp.com") + link = link.replace( + "https://link.yasirweb.my.id", "https://yasirrobot.herokuapp.com" + ) process = await message.reply_text("`Processing, please wait..`") tmp_directory_for_each_user = f"./MissKaty_Genss/{str(message.from_user.id)}" if not os.path.isdir(tmp_directory_for_each_user): @@ -111,7 +133,9 @@ async def genss_link(client, message): chat_id=message.chat.id, message_id=process.id, ) - await client.send_chat_action(chat_id=message.chat.id, action=enums.ChatAction.UPLOAD_PHOTO) + await client.send_chat_action( + chat_id=message.chat.id, action=enums.ChatAction.UPLOAD_PHOTO + ) try: await message.reply_media_group(images, reply_to_message_id=message.id) except FloodWait as e: diff --git a/misskaty/plugins/grup_tools.py b/misskaty/plugins/grup_tools.py index 92414a83..61648c88 100644 --- a/misskaty/plugins/grup_tools.py +++ b/misskaty/plugins/grup_tools.py @@ -234,7 +234,7 @@ async def save_group(bot, message): photo=welcomeimg, caption=f"Hai {u.mention}, Selamat datang digrup {message.chat.title}.", ) - except (ChatSendMediaForbidden, SlowmodeWait, TopicClosed): + except (ChatSendMediaForbidden, SlowmodeWait): await app.leave_chat(message.chat.id) try: os.remove(f"downloads/welcome#{u.id}.png") diff --git a/misskaty/plugins/mediainfo.py b/misskaty/plugins/mediainfo.py index e7679b8f..f856b602 100644 --- a/misskaty/plugins/mediainfo.py +++ b/misskaty/plugins/mediainfo.py @@ -8,9 +8,11 @@ import io from os import remove as osremove import time +import asyncio import subprocess from pyrogram import filters from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup +from pyrogram.errors import FloodWait from misskaty.vars import COMMAND_HANDLER from utils import get_file_id from misskaty import app @@ -51,7 +53,10 @@ async def mediainfo(client, message): text_ = file_info.message_type link = post_to_telegraph(title, body_text) markup = InlineKeyboardMarkup([[InlineKeyboardButton(text=text_, url=link)]]) - await message.reply("â„šī¸ **MEDIA INFO**", reply_markup=markup, quote=True) + try: + await message.reply("â„šī¸ **MEDIA INFO**", reply_markup=markup, quote=True) + except FloodWait as f: + await asyncio.sleep(f.value) await process.delete() try: osremove(file_path) @@ -60,10 +65,6 @@ async def mediainfo(client, message): else: try: link = message.text.split(" ", maxsplit=1)[1] - if link.startswith("https://file.yasirweb.my.id"): - link = link.replace("https://file.yasirweb.my.id", "https://file.yasiraris.workers.dev") - if link.startswith("https://link.yasirweb.my.id"): - link = link.replace("https://link.yasirweb.my.id", "https://yasirrobot.herokuapp.com") process = await message.reply_text("`Mohon tunggu sejenak...`") try: output = subprocess.check_output(["mediainfo", f"{link}"]).decode("utf-8") diff --git a/misskaty/plugins/misc_tools.py b/misskaty/plugins/misc_tools.py index 5c080c4b..27b64709 100644 --- a/misskaty/plugins/misc_tools.py +++ b/misskaty/plugins/misc_tools.py @@ -188,7 +188,7 @@ async def tts(_, message): else: if len(message.text.split()) <= 2: await message.reply_text( - "Berikan Kode bahasa yang valid.\n[Available options](https://telegra.ph/Lang-Codes-11-08).\nUsage: /tts en ", + "Berikan Kode bahasa yang valid.\n[Available options](https://telegra.ph/Lang-Codes-11-08).\n*Usage:* /tts en [text]", ) return target_lang = message.text.split(None, 2)[1] @@ -515,7 +515,18 @@ async def imdb1_search(client, message): @app.on_callback_query(filters.regex("^imdbid")) async def imdbcb_backup(bot: Client, query: CallbackQuery): - i, userid, movie = query.data.split("#") + # ValueError: not enough values to unpack (expected 3, got 2) + # Idk how to reproduce it, so wait people report to me + try: + i, userid, movie = query.data.split("#") + except: + LOGGER.error( + f"ERROR IMDB Callback: {query.data} - {query.from_user.first_name} [{query.from_user.id}]" + ) + return await query.answer( + "âš ī¸ Invalid callback query, silahkan laporkan ke pemilik bot atau buka issue baru di repository MissKaty dengan alasan yang jelas.", + True, + ) if query.from_user.id != int(userid): return await query.answer("âš ī¸ Akses Ditolak!", True) try: @@ -749,7 +760,16 @@ async def imdb_en_search(client, message): @app.on_callback_query(filters.regex("^imdben")) @capture_err async def imdb_en_callback(bot: Client, query: CallbackQuery): - i, userid, movie = query.data.split("#") + try: + i, userid, movie = query.data.split("#") + except: + LOGGER.error( + f"ERROR IMDB Callback: {query.data} - {query.from_user.first_name} [{query.from_user.id}]" + ) + return await query.answer( + "âš ī¸ Invalid callback query, please report to bot owner or open issue in MissKaty repository with relevant details.", + True, + ) if query.from_user.id != int(userid): return await query.answer("âš ī¸ Access Denied!", True) await query.message.edit_caption("âŗ Processing your request..")