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)}")