From 3473c36f62bae125ce4d2016fe4ca2e2bb83d6c9 Mon Sep 17 00:00:00 2001 From: yasirarism <55983182+yasirarism@users.noreply.github.com> Date: Mon, 26 Jun 2023 15:07:17 +0000 Subject: [PATCH] Develop (#104) * admin mention fix * Fix * cache admin * Update __init__.py * style: format code with black and isort (#105) Format code with black and isort This commit fixes the style issues introduced in 57fb50e according to the output from Black and isort. Details: https://app.deepsource.com/gh/yasirarism/MissKatyPyro/transform/c3ccbdad-dd4f-44e8-b2ce-1898c1c9240e/ Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> --------- Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> --- misskaty/__init__.py | 8 +- misskaty/core/decorator/permissions.py | 32 ++- misskaty/helper/kuso_utils.py | 2 +- misskaty/plugins/admin.py | 94 +++++-- misskaty/plugins/ban_user_or_chat.py | 24 +- misskaty/plugins/imdb_search.py | 370 ++++++++++++++++--------- misskaty/plugins/inline_search.py | 58 ++-- misskaty/plugins/lang_setting.py | 18 +- misskaty/plugins/web_scraper.py | 24 +- misskaty/plugins/ytdl_plugins.py | 5 +- 10 files changed, 423 insertions(+), 212 deletions(-) diff --git a/misskaty/__init__.py b/misskaty/__init__.py index 2f0cd7f6..d0aa5f17 100644 --- a/misskaty/__init__.py +++ b/misskaty/__init__.py @@ -41,7 +41,7 @@ MOD_NOLOAD = ["subscene_dl"] HELPABLE = {} cleanmode = {} botStartTime = time.time() -misskaty_version = "v2.8.7 - Stable" +misskaty_version = "v2.9.1 - Stable" # Pyrogram Bot Client app = Client( @@ -58,7 +58,11 @@ user = Client( session_string=USER_SESSION, ) -jobstores = {"default": MongoDBJobStore(client=MongoClient(DATABASE_URI), database=DATABASE_NAME, collection="nightmode")} +jobstores = { + "default": MongoDBJobStore( + client=MongoClient(DATABASE_URI), database=DATABASE_NAME, collection="nightmode" + ) +} scheduler = AsyncIOScheduler(jobstores=jobstores, timezone=TZ) app.start() diff --git a/misskaty/core/decorator/permissions.py b/misskaty/core/decorator/permissions.py index 2c3eef5d..0dc025e2 100644 --- a/misskaty/core/decorator/permissions.py +++ b/misskaty/core/decorator/permissions.py @@ -3,6 +3,7 @@ from time import time from traceback import format_exc as err from typing import Optional, Union +from cachetools import TTLCache from pyrogram import Client, enums from pyrogram.errors import ChannelPrivate, ChatAdminRequired, ChatWriteForbidden from pyrogram.types import CallbackQuery, Message @@ -77,16 +78,22 @@ async def check_perms( if isinstance(permissions, str): permissions = [permissions] - missing_perms = [permission for permission in permissions if not getattr(user.privileges, permission)] + missing_perms = [ + permission + for permission in permissions + if not getattr(user.privileges, permission) + ] if not missing_perms: return True if complain_missing_perms: - await sender(strings("no_permission_error").format(permissions=", ".join(missing_perms))) + await sender( + strings("no_permission_error").format(permissions=", ".join(missing_perms)) + ) return False -admins_in_chat = {} +admins_in_chat = TTLCache(maxsize=1000, ttl=6 * 60 * 60) async def list_admins(chat_id: int): @@ -98,7 +105,12 @@ async def list_admins(chat_id: int): try: admins_in_chat[chat_id] = { "last_updated_at": time(), - "data": [member.user.id async for member in app.get_chat_members(chat_id, filter=enums.ChatMembersFilter.ADMINISTRATORS)], + "data": [ + member.user.id + async for member in app.get_chat_members( + chat_id, filter=enums.ChatMembersFilter.ADMINISTRATORS + ) + ], } return admins_in_chat[chat_id]["data"] except ChannelPrivate: @@ -167,7 +179,9 @@ def require_admin( ): def decorator(func): @wraps(func) - async def wrapper(client: Client, message: Union[CallbackQuery, Message], *args, **kwargs): + async def wrapper( + client: Client, message: Union[CallbackQuery, Message], *args, **kwargs + ): lang = await get_lang(message) strings = partial( get_locale_string, @@ -183,7 +197,9 @@ def require_admin( sender = message.reply_text msg = message else: - raise NotImplementedError(f"require_admin can't process updates with the type '{message.__name__}' yet.") + raise NotImplementedError( + f"require_admin can't process updates with the type '{message.__name__}' yet." + ) # We don't actually check private and channel chats. if msg.chat.type == enums.ChatType.PRIVATE: @@ -192,7 +208,9 @@ def require_admin( return await sender(strings("private_not_allowed")) if msg.chat.type == enums.ChatType.CHANNEL: return await func(client, message, *args, *kwargs) - has_perms = await check_perms(message, permissions, complain_missing_perms, strings) + has_perms = await check_perms( + message, permissions, complain_missing_perms, strings + ) if has_perms: return await func(client, message, *args, *kwargs) diff --git a/misskaty/helper/kuso_utils.py b/misskaty/helper/kuso_utils.py index 6653a326..5c007712 100644 --- a/misskaty/helper/kuso_utils.py +++ b/misskaty/helper/kuso_utils.py @@ -187,7 +187,7 @@ async def byPassPh(url: str, name: str): class Kusonime: def __init__(self): - raise NotImplementedError() + pass @staticmethod async def byPass(url): diff --git a/misskaty/plugins/admin.py b/misskaty/plugins/admin.py index 9cb3d9dd..ef16f70c 100644 --- a/misskaty/plugins/admin.py +++ b/misskaty/plugins/admin.py @@ -93,7 +93,12 @@ async def admin_cache_func(_, cmu): 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)], + "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: @@ -192,7 +197,9 @@ async def kickFunc(client: Client, ctx: Message, strings) -> "Message": # Ban/DBan/TBan User -@app.on_message(filters.command(["ban", "dban", "tban"], COMMAND_HANDLER) & filters.group) +@app.on_message( + filters.command(["ban", "dban", "tban"], COMMAND_HANDLER) & filters.group +) @adminsOnly("can_restrict_members") @ratelimiter @use_chat_lang() @@ -213,7 +220,11 @@ async def banFunc(client, message, strings): 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 = strings("ban_msg").format( mention=mention, @@ -280,7 +291,9 @@ async def unban_func(self, message, strings): # Ban users listed in a message -@app.on_message(filters.user(SUDO) & filters.command("listban", COMMAND_HANDLER) & filters.group) +@app.on_message( + filters.user(SUDO) & filters.command("listban", COMMAND_HANDLER) & filters.group +) @ratelimiter @use_chat_lang() async def list_ban_(c, message, strings): @@ -295,7 +308,9 @@ async def list_ban_(c, message, strings): 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(strings("invalid_tg_link")) if userid == c.me.id: @@ -333,7 +348,9 @@ async def list_ban_(c, message, strings): # Unban users listed in a message -@app.on_message(filters.user(SUDO) & filters.command("listunban", COMMAND_HANDLER) & filters.group) +@app.on_message( + filters.user(SUDO) & filters.command("listunban", COMMAND_HANDLER) & filters.group +) @ratelimiter @use_chat_lang() async def list_unban_(c, message, strings): @@ -365,7 +382,9 @@ async def list_unban_(c, message, strings): continue count += 1 mention = (await app.get_users(userid)).mention - msg = strings("listunban_msg").format(mention=mention, uid=userid, frus=message.from_user.mention, ct=count) + msg = strings("listunban_msg").format( + mention=mention, uid=userid, frus=message.from_user.mention, ct=count + ) await m.edit_text(msg) @@ -387,7 +406,9 @@ async def deleteFunc(_, message, strings): # Promote Members -@app.on_message(filters.command(["promote", "fullpromote"], COMMAND_HANDLER) & filters.group) +@app.on_message( + filters.command(["promote", "fullpromote"], COMMAND_HANDLER) & filters.group +) @adminsOnly("can_promote_members") @ratelimiter @use_chat_lang() @@ -420,7 +441,9 @@ async def promoteFunc(client, message, strings): can_manage_video_chats=bot.privileges.can_manage_video_chats, ), ) - return await message.reply_text(strings("full_promote").format(umention=umention)) + return await message.reply_text( + strings("full_promote").format(umention=umention) + ) await message.chat.promote_member( user_id=user_id, @@ -629,7 +652,11 @@ async def remove_warning(_, cq, strings): if warns: warns = warns["warns"] if not warns or warns == 0: - return await cq.answer(strings("user_no_warn").format(mention=cq.message.reply_to_message.from_user.id)) + return await cq.answer( + strings("user_no_warn").format( + mention=cq.message.reply_to_message.from_user.id + ) + ) warn = {"warns": warns - 1} await add_warn(chat_id, await int_to_alpha(user_id), warn) text = cq.message.text.markdown @@ -723,11 +750,19 @@ async def check_warns(_, message, strings): warns = warns["warns"] else: return await message.reply_text(strings("user_no_warn").format(mention=mention)) - return await message.reply_text(strings("ch_warn_msg").format(mention=mention, warns=warns)) + return await message.reply_text( + strings("ch_warn_msg").format(mention=mention, warns=warns) + ) # Report User in Group -@app.on_message((filters.command("report", COMMAND_HANDLER) | filters.command(["admins", "admin"], prefixes="@")) & filters.group) +@app.on_message( + ( + filters.command("report", COMMAND_HANDLER) + | filters.command(["admins", "admin"], prefixes="@") + ) + & filters.group +) @capture_err @ratelimiter @use_chat_lang() @@ -745,16 +780,27 @@ async def report_user(self: Client, ctx: Message, strings) -> "Message": if linked_chat is None: if reply_id in list_of_admins or reply_id == ctx.chat.id: return await ctx.reply_text(strings("reported_is_admin")) - elif reply_id in list_of_admins or reply_id == ctx.chat.id or reply_id == linked_chat.id: + elif ( + reply_id in list_of_admins + or reply_id == ctx.chat.id + or reply_id == linked_chat.id + ): return await ctx.reply_text(strings("reported_is_admin")) - user_mention = reply.from_user.mention if reply.from_user else reply.sender_chat.title + user_mention = ( + reply.from_user.mention if reply.from_user else reply.sender_chat.title + ) text = strings("report_msg").format(user_mention=user_mention) - admin_data = [m async for m in app.get_chat_members(ctx.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS)] + admin_data = [ + m + async for m in app.get_chat_members( + ctx.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 continue - text += f"\u2063" await ctx.reply_msg(text, reply_to_message_id=ctx.reply_to_message.id) @@ -766,7 +812,9 @@ async def set_chat_title(self: Client, ctx: Message): old_title = ctx.chat.title new_title = ctx.text.split(None, 1)[1] await ctx.chat.set_title(new_title) - await ctx.reply_text(f"Successfully Changed Group Title From {old_title} To {new_title}") + await ctx.reply_text( + f"Successfully Changed Group Title From {old_title} To {new_title}" + ) @app.on_message(filters.command("set_user_title", COMMAND_HANDLER) & ~filters.private) @@ -779,10 +827,14 @@ async def set_user_title(self: Client, ctx: Message): chat_id = ctx.chat.id from_user = ctx.reply_to_message.from_user if len(ctx.command) < 2: - return await ctx.reply_text("**Usage:**\n/set_user_title NEW ADMINISTRATOR TITLE") + return await ctx.reply_text( + "**Usage:**\n/set_user_title NEW ADMINISTRATOR TITLE" + ) title = ctx.text.split(None, 1)[1] await app.set_administrator_title(chat_id, from_user.id, title) - await ctx.reply_text(f"Successfully Changed {from_user.mention}'s Admin Title To {title}") + await ctx.reply_text( + f"Successfully Changed {from_user.mention}'s Admin Title To {title}" + ) @app.on_message(filters.command("set_chat_photo", COMMAND_HANDLER) & ~filters.private) @@ -795,7 +847,9 @@ async def set_chat_photo(self: Client, ctx: Message): file = reply.document or reply.photo if not file: - return await ctx.reply_text("Reply to a photo or document to set it as chat_photo") + return await ctx.reply_text( + "Reply to a photo or document to set it as chat_photo" + ) if file.file_size > 5000000: return await ctx.reply("File size too large.") diff --git a/misskaty/plugins/ban_user_or_chat.py b/misskaty/plugins/ban_user_or_chat.py index 49990714..8a1f7c99 100644 --- a/misskaty/plugins/ban_user_or_chat.py +++ b/misskaty/plugins/ban_user_or_chat.py @@ -12,14 +12,17 @@ from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL, SUDO, SUPPORT_CHAT async def ban_reply(self: Client, ctx: Message): if not ctx.from_user: return - ban = await db.get_ban_status(ctx.from_user.id) - if (ban.get("is_banned") and ctx.chat.type.value == "private") or ( - ban.get("is_banned") and ctx.chat.type.value == "supergroup" and ctx.command - ): - await ctx.reply_msg( - f'I am sorry, You are banned to use Me. \nBan Reason: {ban["ban_reason"]}' - ) - await ctx.stop_propagation() + try: + ban = await db.get_ban_status(ctx.from_user.id) + if (ban.get("is_banned") and ctx.chat.type.value == "private") or ( + ban.get("is_banned") and ctx.chat.type.value == "supergroup" and ctx.command + ): + await ctx.reply_msg( + f'I am sorry, You are banned to use Me. \nBan Reason: {ban["ban_reason"]}' + ) + await ctx.stop_propagation() + except: + await ctx.continue_propagation() @app.on_message(filters.group & filters.incoming, group=-2) @@ -55,7 +58,10 @@ async def grp_bd(self: Client, ctx: Message, strings): await k.pin() except: pass - await self.leave_chat(ctx.chat.id) + try: + await self.leave_chat(ctx.chat.id) + except: + pass await ctx.stop_propagation() diff --git a/misskaty/plugins/imdb_search.py b/misskaty/plugins/imdb_search.py index 66ba2dee..da63279e 100644 --- a/misskaty/plugins/imdb_search.py +++ b/misskaty/plugins/imdb_search.py @@ -38,7 +38,9 @@ from utils import demoji LOGGER = logging.getLogger(__name__) LIST_CARI = {} -headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10"} +headers = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10" +} # IMDB Choose Language @@ -49,10 +51,12 @@ async def imdb_choose(self: Client, ctx: Message): if len(ctx.command) == 1: return await ctx.reply_msg( f"ℹ️ Please add query after CMD!\nEx: /{ctx.command[0]} Jurassic World", - del_in=5, + del_in=7, ) if ctx.sender_chat: - return await ctx.reply_msg("This feature not supported for channel..", del_in=5) + return await ctx.reply_msg( + "Cannot identify user, please use in private chat.", del_in=7 + ) kuery = ctx.text.split(" ", 1)[1] is_imdb, lang = await is_imdbset(ctx.from_user.id) if is_imdb: @@ -80,7 +84,9 @@ async def imdb_choose(self: Client, ctx: Message): except ListenerTimeout: del LIST_CARI[ranval] try: - await msg.edit_caption("πŸ˜Άβ€πŸŒ«οΈ Callback Query Timeout. Task Has Been Canceled!") + await msg.edit_caption( + "πŸ˜Άβ€πŸŒ«οΈ Callback Query Timeout. Task Has Been Canceled!" + ) except MessageIdInvalid: pass @@ -99,14 +105,20 @@ async def imdblangset(self: Client, query: CallbackQuery): ) is_imdb, lang = await is_imdbset(query.from_user.id) if is_imdb: - buttons.row(InlineButton("πŸ—‘ Remove UserSetting", f"setimdb#rm#{query.from_user.id}")) + buttons.row( + InlineButton("πŸ—‘ Remove UserSetting", f"setimdb#rm#{query.from_user.id}") + ) buttons.row(InlineButton("❌ Close", f"close#{query.from_user.id}")) - msg = await query.message.edit_caption("Please select available language below..", reply_markup=buttons) + msg = await query.message.edit_caption( + "Please select available language below..", reply_markup=buttons + ) try: await msg.wait_for_click(from_user_id=int(uid), timeout=30) except ListenerTimeout: try: - await msg.edit_caption("πŸ˜Άβ€πŸŒ«οΈ Callback Query Timeout. Task Has Been Canceled!") + await msg.edit_caption( + "πŸ˜Άβ€πŸŒ«οΈ Callback Query Timeout. Task Has Been Canceled!" + ) except MessageIdInvalid: pass @@ -123,13 +135,19 @@ async def imdbsetlang(self: Client, query: CallbackQuery): return await query.answer(f"⚠️ Your Setting Already in ({langset})!", True) if lang == "eng": await add_imdbset(query.from_user.id, lang) - await query.message.edit_caption("Language interface for IMDB has been changed to English.") + await query.message.edit_caption( + "Language interface for IMDB has been changed to English." + ) elif lang == "ind": await add_imdbset(query.from_user.id, lang) - await query.message.edit_caption("Bahasa tampilan IMDB sudah diubah ke Indonesia.") + await query.message.edit_caption( + "Bahasa tampilan IMDB sudah diubah ke Indonesia." + ) else: await remove_imdbset(query.from_user.id) - await query.message.edit_caption("UserSetting for IMDB has been deleted from database.") + await query.message.edit_caption( + "UserSetting for IMDB has been deleted from database." + ) async def imdb_search_id(kueri, message): @@ -148,7 +166,9 @@ async def imdb_search_id(kueri, message): ) res = r.json().get("d") if not res: - return await k.edit_caption(f"⛔️ Tidak ditemukan hasil untuk kueri: {kueri}") + return await k.edit_caption( + f"⛔️ Tidak ditemukan hasil untuk kueri: {kueri}" + ) msg += f"🎬 Ditemukan ({len(res)}) hasil untuk kueri: {kueri}\n\n" for num, movie in enumerate(res, start=1): title = movie.get("l") @@ -189,7 +209,9 @@ async def imdb_search_id(kueri, message): except MessageIdInvalid: pass except Exception as err: - await k.edit_caption(f"Ooppss, gagal mendapatkan daftar judul di IMDb. Mungkin terkena rate limit atau down.\n\nERROR: {err}") + await k.edit_caption( + f"Ooppss, gagal mendapatkan daftar judul di IMDb. Mungkin terkena rate limit atau down.\n\nERROR: {err}" + ) async def imdb_search_en(kueri, message): @@ -208,7 +230,9 @@ async def imdb_search_en(kueri, message): ) res = r.json().get("d") if not res: - return await k.edit_caption(f"⛔️ Result not found for keywords: {kueri}") + return await k.edit_caption( + f"⛔️ Result not found for keywords: {kueri}" + ) msg += f"🎬 Found ({len(res)}) result for keywords: {kueri}\n\n" for num, movie in enumerate(res, start=1): title = movie.get("l") @@ -249,7 +273,9 @@ async def imdb_search_en(kueri, message): except MessageIdInvalid: pass except Exception as err: - await k.edit_caption(f"Failed when requesting movies title. Maybe got rate limit or down.\n\nERROR: {err}") + await k.edit_caption( + f"Failed when requesting movies title. Maybe got rate limit or down.\n\nERROR: {err}" + ) @app.on_callback_query(filters.regex("^imdbcari")) @@ -276,7 +302,9 @@ async def imdbcari(self: Client, query: CallbackQuery): ) res = r.json().get("d") if not res: - return await query.message.edit_caption(f"⛔️ Tidak ditemukan hasil untuk kueri: {kueri}") + return await query.message.edit_caption( + f"⛔️ Tidak ditemukan hasil untuk kueri: {kueri}" + ) msg += f"🎬 Ditemukan ({len(res)}) hasil dari: {kueri} ~ {query.from_user.mention}\n\n" for num, movie in enumerate(res, start=1): title = movie.get("l") @@ -289,10 +317,16 @@ async def imdbcari(self: Client, query: CallbackQuery): typee = movie.get("q", "N/A").replace("feature", "movie").title() movieID = re.findall(r"tt(\d+)", movie.get("id"))[0] msg += f"{num}. {title} {year} - {typee}\n" - BTN.append(InlineKeyboardButton(text=num, callback_data=f"imdbres_id#{uid}#{movieID}")) + BTN.append( + InlineKeyboardButton( + text=num, callback_data=f"imdbres_id#{uid}#{movieID}" + ) + ) BTN.extend( ( - InlineKeyboardButton(text="🚩 Language", callback_data=f"imdbset#{uid}"), + InlineKeyboardButton( + text="🚩 Language", callback_data=f"imdbset#{uid}" + ), InlineKeyboardButton(text="❌ Close", callback_data=f"close#{uid}"), ) ) @@ -306,7 +340,9 @@ async def imdbcari(self: Client, query: CallbackQuery): except MessageIdInvalid: pass except Exception as err: - await query.message.edit_caption(f"Ooppss, gagal mendapatkan daftar judul di IMDb. Mungkin terkena rate limit atau down.\n\nERROR: {err}") + await query.message.edit_caption( + f"Ooppss, gagal mendapatkan daftar judul di IMDb. Mungkin terkena rate limit atau down.\n\nERROR: {err}" + ) else: if query.from_user.id != int(uid): return await query.answer("⚠️ Access Denied!", True) @@ -325,7 +361,9 @@ async def imdbcari(self: Client, query: CallbackQuery): ) res = r.json().get("d") if not res: - return await query.message.edit_caption(f"⛔️ Result not found for keywords: {kueri}") + return await query.message.edit_caption( + f"⛔️ Result not found for keywords: {kueri}" + ) msg += f"🎬 Found ({len(res)}) result for keywords: {kueri} ~ {query.from_user.mention}\n\n" for num, movie in enumerate(res, start=1): title = movie.get("l") @@ -338,10 +376,16 @@ async def imdbcari(self: Client, query: CallbackQuery): typee = movie.get("q", "N/A").replace("feature", "movie").title() movieID = re.findall(r"tt(\d+)", movie.get("id"))[0] msg += f"{num}. {title} {year} - {typee}\n" - BTN.append(InlineKeyboardButton(text=num, callback_data=f"imdbres_en#{uid}#{movieID}")) + BTN.append( + InlineKeyboardButton( + text=num, callback_data=f"imdbres_en#{uid}#{movieID}" + ) + ) BTN.extend( ( - InlineKeyboardButton(text="🚩 Language", callback_data=f"imdbset#{uid}"), + InlineKeyboardButton( + text="🚩 Language", callback_data=f"imdbset#{uid}" + ), InlineKeyboardButton(text="❌ Close", callback_data=f"close#{uid}"), ) ) @@ -355,7 +399,9 @@ async def imdbcari(self: Client, query: CallbackQuery): except MessageIdInvalid: pass except Exception as err: - await query.message.edit_caption(f"Failed when requesting movies title. Maybe got rate limit or down.\n\nERROR: {err}") + await query.message.edit_caption( + f"Failed when requesting movies title. Maybe got rate limit or down.\n\nERROR: {err}" + ) @app.on_callback_query(filters.regex("^imdbres_id")) @@ -370,78 +416,100 @@ async def imdb_id_callback(self: Client, query: CallbackQuery): imdb_url = f"https://www.imdb.com/title/tt{movie}/" resp = await http.get(imdb_url, headers=headers) sop = BeautifulSoup(resp, "lxml") - r_json = json.loads(sop.find("script", attrs={"type": "application/ld+json"}).contents[0]) + r_json = json.loads( + sop.find("script", attrs={"type": "application/ld+json"}).contents[0] + ) ott = await search_jw(r_json.get("name"), "ID") typee = r_json.get("@type", "") res_str = "" - tahun = re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text)[0] if re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text) else "N/A" + tahun = ( + re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text)[0] + if re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text) + else "N/A" + ) res_str += f"πŸ“Ή Judul: {r_json.get('name')} [{tahun}] ({typee})\n" if aka := r_json.get("alternateName"): res_str += f"πŸ“’ AKA: {aka}\n\n" else: res_str += "\n" if durasi := sop.select('li[data-testid="title-techspec_runtime"]'): - durasi = durasi[0].find(class_="ipc-metadata-list-item__content-container").text + durasi = ( + durasi[0].find(class_="ipc-metadata-list-item__content-container").text + ) res_str += f"Durasi: {GoogleTranslator('auto', 'id').translate(durasi)}\n" if kategori := r_json.get("contentRating"): res_str += f"Kategori: {kategori} \n" if rating := r_json.get("aggregateRating"): res_str += f"Peringkat: {rating['ratingValue']}⭐️ dari {rating['ratingCount']} pengguna\n" if release := sop.select('li[data-testid="title-details-releasedate"]'): - rilis = release[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link").text - rilis_url = release[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")["href"] - res_str += f"Rilis: {rilis}\n" + rilis = ( + release[0] + .find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + .text + ) + rilis_url = release[0].find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + )["href"] + res_str += ( + f"Rilis: {rilis}\n" + ) if genre := r_json.get("genre"): - genre = "".join(f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " if i in GENRES_EMOJI else f"#{i.replace('-', '_').replace(' ', '_')}, " for i in r_json["genre"]) - genre = genre[:-2] - res_str += f"Genre: {genre}\n" + genre = "".join( + f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " + if i in GENRES_EMOJI + else f"#{i.replace('-', '_').replace(' ', '_')}, " + for i in r_json["genre"] + ) + res_str += f"Genre: {genre[:-2]}\n" if negara := sop.select('li[data-testid="title-details-origin"]'): - country = "".join(f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " for country in negara[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")) - country = country[:-2] - res_str += f"Negara: {country}\n" + country = "".join( + f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " + for country in negara[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Negara: {country[:-2]}\n" if bahasa := sop.select('li[data-testid="title-details-languages"]'): - language = "".join(f"#{lang.text.replace(' ', '_').replace('-', '_')}, " for lang in bahasa[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")) - language = language[:-2] - res_str += f"Bahasa: {language}\n" + language = "".join( + f"#{lang.text.replace(' ', '_').replace('-', '_')}, " + for lang in bahasa[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Bahasa: {language[:-2]}\n" res_str += "\nπŸ™Ž Info Cast:\n" if directors := r_json.get("director"): - director = "" - for i in directors: - name = i["name"] - url = i["url"] - director += f"{name}, " - director = director[:-2] - res_str += f"Sutradara: {director}\n" + director = director = "".join( + f"{i['name']}, " for i in r_json["director"] + ) + res_str += f"Sutradara: {director[:-2]}\n" if creators := r_json.get("creator"): - creator = "" - for i in creators: - if i["@type"] == "Person": - name = i["name"] - url = i["url"] - creator += f"{name}, " - creator = creator[:-2] - res_str += f"Penulis: {creator}\n" + creator = "".join( + f"{i['name']}, " + for i in r_json["creator"] + if i["@type"] == "Person" + ) + res_str += f"Penulis: {creator[:-2]}\n" if actor := r_json.get("actor"): - actors = "" - for i in actor: - name = i["name"] - url = i["url"] - actors += f"{name}, " - actors = actors[:-2] - res_str += f"Pemeran: {actors}\n\n" + actors = "".join( + f"{i['name']}, " for i in r_json["actor"] + ) + res_str += f"Pemeran: {actors[:-2]}\n\n" if deskripsi := r_json.get("description"): summary = GoogleTranslator("auto", "id").translate(deskripsi) res_str += f"πŸ“œ Plot: {summary}\n\n" if keywd := r_json.get("keywords"): - keywords = keywd.split(",") - key_ = "" - for i in keywords: - i = i.replace(" ", "_").replace("-", "_") - key_ += f"#{i}, " - key_ = key_[:-2] - res_str += f"πŸ”₯ Kata Kunci: {key_} \n" + key_ = "".join( + f"#{i.replace(' ', '_').replace('-', '_')}, " + for i in r_json["keywords"].split(",") + ) + res_str += f"πŸ”₯ Kata Kunci: {key_[:-2]} \n" if award := sop.select('li[data-testid="award_information"]'): - awards = award[0].find(class_="ipc-metadata-list-item__list-content-item").text + awards = ( + award[0].find(class_="ipc-metadata-list-item__list-content-item").text + ) res_str += f"πŸ† Penghargaan: {GoogleTranslator('auto', 'id').translate(awards)}\n" else: res_str += "\n" @@ -459,25 +527,37 @@ async def imdb_id_callback(self: Client, query: CallbackQuery): ] ) else: - markup = InlineKeyboardMarkup([[InlineKeyboardButton("🎬 Open IMDB", url=imdb_url)]]) + markup = InlineKeyboardMarkup( + [[InlineKeyboardButton("🎬 Open IMDB", url=imdb_url)]] + ) if thumb := r_json.get("image"): try: await query.message.edit_media( - InputMediaPhoto(thumb, caption=res_str, parse_mode=enums.ParseMode.HTML), + InputMediaPhoto( + thumb, caption=res_str, parse_mode=enums.ParseMode.HTML + ), reply_markup=markup, ) except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty): poster = thumb.replace(".jpg", "._V1_UX360.jpg") await query.message.edit_media( - InputMediaPhoto(poster, caption=res_str, parse_mode=enums.ParseMode.HTML), + InputMediaPhoto( + poster, caption=res_str, parse_mode=enums.ParseMode.HTML + ), reply_markup=markup, ) except MediaCaptionTooLong: - await query.message.reply(res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup) + await query.message.reply( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) except Exception: - await query.message.edit_caption(res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup) + await query.message.edit_caption( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) else: - await query.message.edit_caption(res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup) + await query.message.edit_caption( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) except (MessageNotModified, MessageIdInvalid): pass @@ -494,77 +574,99 @@ async def imdb_en_callback(self: Client, query: CallbackQuery): imdb_url = f"https://www.imdb.com/title/tt{movie}/" resp = await http.get(imdb_url, headers=headers) sop = BeautifulSoup(resp, "lxml") - r_json = json.loads(sop.find("script", attrs={"type": "application/ld+json"}).contents[0]) + r_json = json.loads( + sop.find("script", attrs={"type": "application/ld+json"}).contents[0] + ) ott = await search_jw(r_json.get("name"), "US") typee = r_json.get("@type", "") res_str = "" - tahun = re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text)[0] if re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text) else "N/A" + tahun = ( + re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text)[0] + if re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text) + else "N/A" + ) res_str += f"πŸ“Ή Judul: {r_json.get('name')} [{tahun}] ({typee})\n" if aka := r_json.get("alternateName"): res_str += f"πŸ“’ AKA: {aka}\n\n" else: res_str += "\n" if durasi := sop.select('li[data-testid="title-techspec_runtime"]'): - durasi = durasi[0].find(class_="ipc-metadata-list-item__content-container").text + durasi = ( + durasi[0].find(class_="ipc-metadata-list-item__content-container").text + ) res_str += f"Duration: {durasi}\n" if kategori := r_json.get("contentRating"): res_str += f"Category: {kategori} \n" if rating := r_json.get("aggregateRating"): res_str += f"Rating: {rating['ratingValue']}⭐️ from {rating['ratingCount']} users\n" if release := sop.select('li[data-testid="title-details-releasedate"]'): - rilis = release[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link").text - rilis_url = release[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")["href"] - res_str += f"Rilis: {rilis}\n" + rilis = ( + release[0] + .find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + .text + ) + rilis_url = release[0].find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + )["href"] + res_str += ( + f"Rilis: {rilis}\n" + ) if genre := r_json.get("genre"): - genre = "".join(f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " if i in GENRES_EMOJI else f"#{i.replace('-', '_').replace(' ', '_')}, " for i in r_json["genre"]) - genre = genre[:-2] - res_str += f"Genre: {genre}\n" + genre = "".join( + f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " + if i in GENRES_EMOJI + else f"#{i.replace('-', '_').replace(' ', '_')}, " + for i in r_json["genre"] + ) + res_str += f"Genre: {genre[:-2]}\n" if negara := sop.select('li[data-testid="title-details-origin"]'): - country = "".join(f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " for country in negara[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")) - country = country[:-2] - res_str += f"Country: {country}\n" + country = "".join( + f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " + for country in negara[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Country: {country[:-2]}\n" if bahasa := sop.select('li[data-testid="title-details-languages"]'): - language = "".join(f"#{lang.text.replace(' ', '_').replace('-', '_')}, " for lang in bahasa[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")) - language = language[:-2] - res_str += f"Language: {language}\n" + language = "".join( + f"#{lang.text.replace(' ', '_').replace('-', '_')}, " + for lang in bahasa[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Language: {language[:-2]}\n" res_str += "\nπŸ™Ž Cast Info:\n" - if directors := r_json.get("director"): - director = "" - for i in directors: - name = i["name"] - url = i["url"] - director += f"{name}, " - director = director[:-2] - res_str += f"Director: {director}\n" - if creators := r_json.get("creator"): - creator = "" - for i in creators: - if i["@type"] == "Person": - name = i["name"] - url = i["url"] - creator += f"{name}, " - creator = creator[:-2] - res_str += f"Writer: {creator}\n" - if actor := r_json.get("actor"): - actors = "" - for i in actor: - name = i["name"] - url = i["url"] - actors += f"{name}, " - actors = actors[:-2] - res_str += f"Stars: {actors}\n\n" + if r_json.get("director"): + director = "".join( + f"{i['name']}, " for i in r_json["director"] + ) + res_str += f"Director: {director[:-2]}\n" + if r_json.get("creator"): + creator = "".join( + f"{i['name']}, " + for i in r_json["creator"] + if i["@type"] == "Person" + ) + res_str += f"Writer: {creator[-2]}\n" + if r_json.get("actor"): + actors = actors = "".join( + f"{i['name']}, " for i in r_json["actor"] + ) + res_str += f"Stars: {actors[:-2]}\n\n" if description := r_json.get("description"): res_str += f"πŸ“œ Summary: {description}\n\n" - if keywd := r_json.get("keywords"): - keywords = keywd.split(",") - key_ = "" - for i in keywords: - i = i.replace(" ", "_").replace("-", "_") - key_ += f"#{i}, " - key_ = key_[:-2] - res_str += f"πŸ”₯ Keywords: {key_} \n" + if r_json.get("keywords"): + key_ = "".join( + f"#{i.replace(' ', '_').replace('-', '_')}, " + for i in r_json["keywords"].split(",") + ) + res_str += f"πŸ”₯ Keywords: {key_[:-2]} \n" if award := sop.select('li[data-testid="award_information"]'): - awards = award[0].find(class_="ipc-metadata-list-item__list-content-item").text + awards = ( + award[0].find(class_="ipc-metadata-list-item__list-content-item").text + ) res_str += f"πŸ† Awards: {awards}\n" else: res_str += "\n" @@ -582,24 +684,36 @@ async def imdb_en_callback(self: Client, query: CallbackQuery): ] ) else: - markup = InlineKeyboardMarkup([[InlineKeyboardButton("🎬 Open IMDB", url=imdb_url)]]) + markup = InlineKeyboardMarkup( + [[InlineKeyboardButton("🎬 Open IMDB", url=imdb_url)]] + ) if thumb := r_json.get("image"): try: await query.message.edit_media( - InputMediaPhoto(thumb, caption=res_str, parse_mode=enums.ParseMode.HTML), + InputMediaPhoto( + thumb, caption=res_str, parse_mode=enums.ParseMode.HTML + ), reply_markup=markup, ) except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty): poster = thumb.replace(".jpg", "._V1_UX360.jpg") await query.message.edit_media( - InputMediaPhoto(poster, caption=res_str, parse_mode=enums.ParseMode.HTML), + InputMediaPhoto( + poster, caption=res_str, parse_mode=enums.ParseMode.HTML + ), reply_markup=markup, ) except MediaCaptionTooLong: - await query.message.reply(res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup) + await query.message.reply( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) except Exception: - await query.message.edit_caption(res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup) + await query.message.edit_caption( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) else: - await query.message.edit_caption(res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup) + await query.message.edit_caption( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) except (MessageNotModified, MessageIdInvalid): pass diff --git a/misskaty/plugins/inline_search.py b/misskaty/plugins/inline_search.py index 05b242f6..a364d1ed 100644 --- a/misskaty/plugins/inline_search.py +++ b/misskaty/plugins/inline_search.py @@ -659,8 +659,7 @@ async def imdb_inl(_, query): else f"#{i.replace('-', '_').replace(' ', '_')}, " for i in r_json["genre"] ) - genre = genre[:-2] - res_str += f"Genre: {genre}\n" + res_str += f"Genre: {genre[:-2]}\n" if negara := sop.select('li[data-testid="title-details-origin"]'): country = "".join( f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " @@ -668,8 +667,7 @@ async def imdb_inl(_, query): class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" ) ) - country = country[:-2] - res_str += f"Negara: {country}\n" + res_str += f"Negara: {country[:-2]}\n" if bahasa := sop.select('li[data-testid="title-details-languages"]'): language = "".join( f"#{lang.text.replace(' ', '_').replace('-', '_')}, " @@ -677,47 +675,37 @@ async def imdb_inl(_, query): class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" ) ) - language = language[:-2] - res_str += f"Bahasa: {language}\n" + res_str += f"Bahasa: {language[:-2]}\n" res_str += "\nπŸ™Ž Info Cast:\n" if r_json.get("director"): - director = "" - for i in r_json["director"]: - name = i["name"] - url = i["url"] - director += f"{name}, " - director = director[:-2] - res_str += f"Sutradara: {director}\n" + director = "".join( + f"{i['name']}, " + for i in r_json["director"] + ) + res_str += f"Sutradara: {director[:-2]}\n" if r_json.get("creator"): - creator = "" - for i in r_json["creator"]: - if i["@type"] == "Person": - name = i["name"] - url = i["url"] - creator += f"{name}, " - creator = creator[:-2] - res_str += f"Penulis: {creator}\n" + creator = "".join( + f"{i['name']}, " + for i in r_json["creator"] + if i["@type"] == "Person" + ) + res_str += f"Penulis: {creator[:-2]}\n" if r_json.get("actor"): - actors = "" - for i in r_json["actor"]: - name = i["name"] - url = i["url"] - actors += f"{name}, " - actors = actors[:-2] - res_str += f"Pemeran: {actors}\n\n" + actors = "".join( + f"{i['name']}, " for i in r_json["actor"] + ) + res_str += f"Pemeran: {actors[:-2]}\n\n" if r_json.get("description"): summary = GoogleTranslator("auto", "id").translate( r_json.get("description") ) res_str += f"πŸ“œ Plot: {summary}\n\n" if r_json.get("keywords"): - keywords = r_json["keywords"].split(",") - key_ = "" - for i in keywords: - i = i.replace(" ", "_").replace("-", "_") - key_ += f"#{i}, " - key_ = key_[:-2] - res_str += f"πŸ”₯ Kata Kunci: {key_} \n" + key_ = "".join( + f"#{i.replace(' ', '_').replace('-', '_')}, " + for i in r_json["keywords"].split(",") + ) + res_str += f"πŸ”₯ Kata Kunci: {key_[:-2]} \n" if award := sop.select('li[data-testid="award_information"]'): awards = ( award[0] diff --git a/misskaty/plugins/lang_setting.py b/misskaty/plugins/lang_setting.py index e6f2d9a1..a5f3a5e1 100644 --- a/misskaty/plugins/lang_setting.py +++ b/misskaty/plugins/lang_setting.py @@ -59,7 +59,11 @@ async def chlang(c: Client, m: Union[CallbackQuery, Message], strings): keyboard = InlineKeyboardMarkup( inline_keyboard=[ *gen_langs_kb(), - [InlineKeyboardButton(strings("back_btn", context="general"), callback_data="start_back")], + [ + InlineKeyboardButton( + strings("back_btn", context="general"), callback_data="start_back" + ) + ], ] ) @@ -69,8 +73,14 @@ async def chlang(c: Client, m: Union[CallbackQuery, Message], strings): else: msg = m sender = msg.reply_text + if not msg.from_user: + return - res = strings("language_changer_private") if msg.chat.type == ChatType.PRIVATE else strings("language_changer_chat") + res = ( + strings("language_changer_private") + if msg.chat.type == ChatType.PRIVATE + else strings("language_changer_chat") + ) msg = await sender(res, reply_markup=keyboard) try: await msg.wait_for_click(from_user_id=m.from_user.id, timeout=30) @@ -105,4 +115,6 @@ async def set_chat_lang(c: Client, m: CallbackQuery, strings): ) else: keyboard = None - await m.message.edit_text(strings("language_changed_successfully"), reply_markup=keyboard) + await m.message.edit_msg( + strings("language_changed_successfully"), reply_markup=keyboard + ) diff --git a/misskaty/plugins/web_scraper.py b/misskaty/plugins/web_scraper.py index cea7f180..f52c85ae 100644 --- a/misskaty/plugins/web_scraper.py +++ b/misskaty/plugins/web_scraper.py @@ -220,11 +220,15 @@ async def getDataKuso(msg, kueri, CurrentPage, user, strings): kusoResult += f"{index*6+c}. {i['title']}\n{i['link']}\n\n" if c < 6: extractbtn1.append( - InlineButton(c, f"kusoextract#{CurrentPage}#{c}#{user}#{msg.id}") + InlineButton( + index * 6 + c, f"kusoextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) ) else: extractbtn2.append( - InlineButton(c, f"kusoextract#{CurrentPage}#{c}#{user}#{msg.id}") + InlineButton( + index * 6 + c, f"kusoextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) ) kusoResult = "".join(i for i in kusoResult if i not in "[]") return kusoResult, PageLen, extractbtn1, extractbtn2 @@ -316,7 +320,9 @@ async def getDataSavefilm21(msg, kueri, CurrentPage, user, strings): for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): sfResult += f"{index*6+c}. {i['judul']}\nGenre: {i['genre']}\n\n" extractbtn.append( - InlineButton(c, f"sf21extract#{CurrentPage}#{c}#{user}#{msg.id}") + InlineButton( + index * 6 + c, f"sf21extract#{CurrentPage}#{c}#{user}#{msg.id}" + ) ) sfResult = "".join(i for i in sfResult if i not in "[]") return sfResult, PageLen, extractbtn @@ -366,7 +372,9 @@ async def getDataLendrive(msg, kueri, CurrentPage, user, strings): for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): lenddataResult += f"{index*6+c}. {i['judul']}\n{strings('quality')}: {i['quality']}\nStatus: {i['status']}\n\n" extractbtn.append( - InlineButton(c, f"lendriveextract#{CurrentPage}#{c}#{user}#{msg.id}") + InlineButton( + index * 6 + c, f"lendriveextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) ) lenddataResult = "".join(i for i in lenddataResult if i not in "[]") return lenddataResult, PageLen, extractbtn @@ -415,7 +423,9 @@ async def getDataMelong(msg, kueri, CurrentPage, user, strings): for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): melongResult += f"{index*6+c}. {i['judul']}\n{strings('quality')}: {i['quality']}\n\n" extractbtn.append( - InlineButton(c, f"melongextract#{CurrentPage}#{c}#{user}#{msg.id}") + InlineButton( + index * 6 + c, f"melongextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) ) melongResult = "".join(i for i in melongResult if i not in "[]") return melongResult, PageLen, extractbtn @@ -466,7 +476,9 @@ async def getDataGomov(msg, kueri, CurrentPage, user, strings): gomovResult += f"{index*6+c}. {i['judul']}\nGenre: {i['genre']}\n\n" if not re.search(r"Series", i["genre"]): extractbtn.append( - InlineButton(c, f"gomovextract#{CurrentPage}#{c}#{user}#{msg.id}") + InlineButton( + index * 6 + c, f"gomovextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) ) gomovResult += strings("unsupport_dl_btn") gomovResult = "".join(i for i in gomovResult if i not in "[]") diff --git a/misskaty/plugins/ytdl_plugins.py b/misskaty/plugins/ytdl_plugins.py index 7cb8678b..1a1278dd 100644 --- a/misskaty/plugins/ytdl_plugins.py +++ b/misskaty/plugins/ytdl_plugins.py @@ -108,7 +108,10 @@ async def ytdownv2(self: Client, ctx: Message, strings): ) await msg.wait_for_click(from_user_id=ctx.from_user.id, timeout=30) except ListenerTimeout: - await msg.edit_caption(strings("exp_task", context="general")) + try: + await msg.edit_caption(strings("exp_task", context="general")) + except MessageIdInvalid: + pass except Exception as err: await ctx.reply_msg(f"Opps, ERROR: {str(err)}")