From 6f84d981e16823a31c97e11e75ffdb70400df7a9 Mon Sep 17 00:00:00 2001 From: yasir Date: Mon, 13 Feb 2023 10:01:59 +0700 Subject: [PATCH] Fix --- misskaty/core/message_utils.py | 4 +++- misskaty/plugins/bypass.py | 20 +++++++++++--------- misskaty/plugins/dev.py | 5 ++++- misskaty/plugins/genss.py | 29 ++++------------------------- misskaty/plugins/grup_tools.py | 26 +++++++++++++++++++++++--- misskaty/plugins/mediainfo.py | 1 + misskaty/plugins/misc_tools.py | 9 +++------ misskaty/plugins/notes.py | 6 +++--- misskaty/plugins/sangmata.py | 21 +++++++++++---------- misskaty/plugins/sub_extractor.py | 25 +++++++++++++------------ misskaty/plugins/web_scraper.py | 6 +++--- 11 files changed, 79 insertions(+), 73 deletions(-) diff --git a/misskaty/core/message_utils.py b/misskaty/core/message_utils.py index b8c5d719..9182cee2 100644 --- a/misskaty/core/message_utils.py +++ b/misskaty/core/message_utils.py @@ -1,7 +1,7 @@ import asyncio from logging import getLogger -from pyrogram.errors import ChatWriteForbidden, FloodWait, MessageNotModified, ChatAdminRequired, MessageIdInvalid +from pyrogram.errors import ChatWriteForbidden, FloodWait, MessageNotModified, ChatAdminRequired, MessageDeleteForbidden, MessageIdInvalid LOGGER = getLogger(__name__) @@ -41,6 +41,8 @@ async def editPesan(msg, text, **kwargs): async def hapusPesan(msg): try: return await msg.delete() + except (MessageDeleteForbidden, ChatAdminRequired): + return except FloodWait as e: LOGGER.warning(str(e)) await asyncio.sleep(e.value) diff --git a/misskaty/plugins/bypass.py b/misskaty/plugins/bypass.py index 2ddbb319..bbdd1de9 100644 --- a/misskaty/plugins/bypass.py +++ b/misskaty/plugins/bypass.py @@ -72,16 +72,18 @@ def wetransfer_bypass(url: str) -> str: if recipient_id: j["recipient_id"] = recipient_id + try: + s = requests.Session() + r = s.get("https://wetransfer.com/") + m = re.search('name="csrf-token" content="([^"]+)"', r.text) + s.headers.update({"x-csrf-token": m[1], "x-requested-with": "XMLHttpRequest"}) + r = s.post(f"https://wetransfer.com/api/v4/transfers/{transfer_id}/download", json=j) + j = r.json() + dl_url = j["direct_link"] - s = requests.Session() - r = s.get("https://wetransfer.com/") - m = re.search('name="csrf-token" content="([^"]+)"', r.text) - s.headers.update({"x-csrf-token": m[1], "x-requested-with": "XMLHttpRequest"}) - r = s.post(f"https://wetransfer.com/api/v4/transfers/{transfer_id}/download", json=j) - j = r.json() - dl_url = j["direct_link"] - - return f"\n**Source Link** :\n`{url}`\n**Direct Link :**\n{dl_url}" + return f"\n**Source Link** :\n`{url}`\n**Direct Link :**\n{dl_url}" + except Exception as er: + return er @app.on_message(filters.command(["directurl"], COMMAND_HANDLER)) diff --git a/misskaty/plugins/dev.py b/misskaty/plugins/dev.py index bf5cbaec..fe303cdc 100644 --- a/misskaty/plugins/dev.py +++ b/misskaty/plugins/dev.py @@ -153,7 +153,10 @@ async def evaluation_cmd_t(_, m): reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="❌ Close", callback_data=f"close#{m.from_user.id}")]]), ) os.remove("MissKatyEval.txt") - await m.delete() if m.from_user.is_self else await status_message.delete() + if m.from_user.is_self: + await m.delete() + else: + await status_message.delete() else: await edit_or_reply( m, diff --git a/misskaty/plugins/genss.py b/misskaty/plugins/genss.py index 4039f7dd..703316d6 100644 --- a/misskaty/plugins/genss.py +++ b/misskaty/plugins/genss.py @@ -29,8 +29,7 @@ LOGGER = getLogger(__name__) __MODULE__ = "MediaTool" __HELP__ = """" -/genss [reply to video] - Generate Screenshot From Video. -/genss_link [link] - Generate Screenshot Video From URL. (Unstable) +/genss [reply to video] - Generate Screenshot From Video. (Support TG Media and Direct URL) /mediainfo [link/reply to TG Video] - Get Mediainfo From File. """ @@ -38,6 +37,7 @@ __HELP__ = """" @app.on_message(filters.command(["genss"], COMMAND_HANDLER) & wait(30)) @capture_err async def genss(client, m): + if not m.from_user: return replied = m.reply_to_message if len(m.command) == 2 and is_url(m.command[1]): snt = await kirimPesan(m, "Give me some time to process your request!! 😴", quote=True) @@ -55,8 +55,8 @@ async def genss(client, m): vid = [replied.video, replied.document] media = next((v for v in vid if v is not None), None) if media is None: - return await kirimPesan(m, "Reply to a Telegram Video or document as video to generate screenshoot!") - process = await kirimPesan(m, "`Processing, please wait..`") + return await kirimPesan(m, "Reply to a Telegram Video or document as video to generate screenshoot!", quote=True) + process = await kirimPesan(m, "Processing, please wait..", quote=True) c_time = time.time() the_real_download_location = await replied.download( @@ -107,27 +107,6 @@ async def genss(client, m): else: await kirimPesan(m, "Reply to a Telegram media to get screenshots from media..") - -@app.on_message(filters.command(["genss_link"], COMMAND_HANDLER)) -@capture_err -async def genss_link(client, m): - if len(m.command) == 1: - return await kirimPesan(m, f"Use /{m.command[0]} link to generate screenshot from URL.") - if not is_url(m.command[1]): - return await kirimPesan(m, "Please use valid URL.") - snt = await m.reply_text("Give me some time to process your request!! 😴", quote=True) - - duration = await get_duration(m.command[1]) - if isinstance(duration, str): - return await snt.edit_text("😟 Sorry! (╥﹏╥) I cannot open the file.") - - btns = gen_ik_buttons() - - await snt.edit_text( - text=f"Now choose how many result for screenshot? 🥳.\n\nTotal duration: `{datetime.timedelta(seconds=duration)}` (`{duration}s`)", - reply_markup=InlineKeyboardMarkup(btns) - ) - @app.on_callback_query(filters.regex(r'^scht')) async def _(c, m): asyncio.create_task(screenshot_flink(c, m)) \ No newline at end of file diff --git a/misskaty/plugins/grup_tools.py b/misskaty/plugins/grup_tools.py index f9a43b93..79e3b2c5 100644 --- a/misskaty/plugins/grup_tools.py +++ b/misskaty/plugins/grup_tools.py @@ -11,7 +11,7 @@ from pyrogram.errors import ( ChatSendMediaForbidden, MessageTooLong, RPCError, - SlowmodeWait, + TopicClosed, ) from pyrogram.types import ChatMemberUpdated, InlineKeyboardButton, InlineKeyboardMarkup @@ -194,8 +194,28 @@ async def save_group(bot, message): photo=welcomeimg, caption=f"Hai {u.mention}, Selamat datang digrup {message.chat.title}.", ) - except (ChatSendMediaForbidden, SlowmodeWait): - await app.leave_chat(message.chat.id) + userspammer = "" + # Spamwatch Detection + try: + headers = {"Authorization": "Bearer XvfzE4AUNXkzCy0DnIVpFDlxZi79lt6EnwKgBj8Quuzms0OSdHvf1k6zSeyzZ_lz"} + apispamwatch = (await http.get(f"https://api.spamwat.ch/banlist/{u.id}", headers=headers)).json() + if not apispamwatch.get("error"): + await app.ban_chat_member(message.chat.id, u.id, datetime.now() + timedelta(seconds=30)) + userspammer += f"#SpamWatch Federation Ban\nUser {u.mention} [{u.id}] has been kicked because {apispamwatch.get('reason')}.\n" + except Exception as err: + LOGGER.error(f"ERROR in Spamwatch Detection. {err}") + # Combot API Detection + try: + apicombot = (await http.get(f"https://api.cas.chat/check?user_id={u.id}")).json() + if apicombot.get("ok") == "true": + await app.ban_chat_member(message.chat.id, u.id, datetime.now() + timedelta(seconds=30)) + userspammer += f"#CAS Federation Ban\nUser {u.mention} [{u.id}] detected as spambot and has been kicked. Powered by Combot AntiSpam." + except Exception as err: + LOGGER.error(f"ERROR in Combot API Detection. {err}") + if userspammer != "": + await bot.send_message(message.chat.id, userspammer) + except: + pass try: os.remove(f"downloads/welcome#{u.id}.png") os.remove(f"downloads/pp{u.id}.png") diff --git a/misskaty/plugins/mediainfo.py b/misskaty/plugins/mediainfo.py index 877740bc..2f09108b 100644 --- a/misskaty/plugins/mediainfo.py +++ b/misskaty/plugins/mediainfo.py @@ -24,6 +24,7 @@ from utils import get_file_id @app.on_message(filters.command(["mediainfo"], COMMAND_HANDLER) & wait(30)) async def mediainfo(client, message): + if not m.from_user: return if message.reply_to_message and message.reply_to_message.media: process = await kirimPesan(message, "`Sedang memproses, lama waktu tergantung ukuran file kamu...`", quote=True) file_info = get_file_id(message.reply_to_message) diff --git a/misskaty/plugins/misc_tools.py b/misskaty/plugins/misc_tools.py index efa5d4d4..436cf4d8 100644 --- a/misskaty/plugins/misc_tools.py +++ b/misskaty/plugins/misc_tools.py @@ -24,7 +24,7 @@ from pyrogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMa from misskaty import BOT_USERNAME, app from misskaty.core.decorator.errors import capture_err -from misskaty.core.message_utils import kirimPesan +from misskaty.core.message_utils import hapusPesan, kirimPesan from misskaty.helper.http import http from misskaty.helper.tools import rentry from misskaty.vars import COMMAND_HANDLER @@ -308,11 +308,8 @@ async def close_callback(bot: Client, query: CallbackQuery): return await query.answer("⚠️ Access Denied!", True) await query.answer("Deleting this message in 5 seconds.") await asyncio.sleep(5) - await query.message.delete() - try: - await query.message.reply_to_message.delete() - except: - pass + await hapusPesan(query.message) + await hapusPesan(query.message.reply_to_message) 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"} diff --git a/misskaty/plugins/notes.py b/misskaty/plugins/notes.py index 09ea7226..9b87aeed 100644 --- a/misskaty/plugins/notes.py +++ b/misskaty/plugins/notes.py @@ -48,7 +48,7 @@ __HELP__ = """/notes To Get All The Notes In The Chat. async def save_notee(_, message): if len(message.command) < 2 or not message.reply_to_message: await message.reply( - text="**Usage:**\nReply to a text or sticker with /save [NOTE_NAME] to save it.", + text="**Usage:**\nReply to a text or sticker with /addnote [NOTE_NAME] to save it.", ) elif not message.reply_to_message.text and not message.reply_to_message.sticker: @@ -113,10 +113,10 @@ async def get_one_note(_, message): @adminsOnly("can_change_info") async def del_note(_, message): if len(message.command) == 1: - return await message.reply("**Usage**\n__/delete [NOTE_NAME]__") + return await message.reply("**Usage**\n__/delnote [NOTE_NAME]__") name = message.text.split(None, 1)[1].strip() if not name: - return await message.reply("**Usage**\n__/delete [NOTE_NAME]__") + return await message.reply("**Usage**\n__/delnote [NOTE_NAME]__") message.text.split()[0][0] chat_id = message.chat.id diff --git a/misskaty/plugins/sangmata.py b/misskaty/plugins/sangmata.py index 6571d4b9..ffe53f0c 100644 --- a/misskaty/plugins/sangmata.py +++ b/misskaty/plugins/sangmata.py @@ -3,6 +3,7 @@ from pyrogram import filters from database.sangmata_db import * from misskaty import app from misskaty.core.decorator.permissions import adminsOnly +from misskaty.core.message_utils import kirimPesan from misskaty.vars import COMMAND_HANDLER __MODULE__ = "SangMata" @@ -25,16 +26,16 @@ async def cek_mataa(_, m): if username != m.from_user.username or first_name != m.from_user.first_name or last_name != m.from_user.last_name: msg += "👀 Mata MissKaty\n\n" if username != m.from_user.username: - msg += f"{m.from_user.mention} [{m.from_user.id}] changed username from @{username} to @{m.from_user.username}.\n" + msg += f"{m.from_user.mention} [{m.from_user.id}] changed username from @{username} to @{m.from_user.username}.\n" await add_userdata(m.from_user.id, m.from_user.username, m.from_user.first_name, m.from_user.last_name) if first_name != m.from_user.first_name: - msg += f"{m.from_user.mention} [{m.from_user.id}] changed first_name from {first_name} to {m.from_user.first_name}.\n" + msg += f"{m.from_user.mention} [{m.from_user.id}] changed first_name from {first_name} to {m.from_user.first_name}.\n" await add_userdata(m.from_user.id, m.from_user.username, m.from_user.first_name, m.from_user.last_name) if last_name != m.from_user.last_name: - msg += f"{m.from_user.mention} [{m.from_user.id}] changed last_name from {last_name} to {m.from_user.last_name}." + msg += f"{m.from_user.mention} [{m.from_user.id}] changed last_name from {last_name} to {m.from_user.last_name}." await add_userdata(m.from_user.id, m.from_user.username, m.from_user.first_name, m.from_user.last_name) if msg != "": - await m.reply(msg, quote=True) + await kirimPesan(m, msg, quote=True) @app.on_message( filters.group & filters.command("sangmata_set", COMMAND_HANDLER) & ~filters.bot & ~filters.via_bot @@ -42,20 +43,20 @@ async def cek_mataa(_, m): @adminsOnly("can_change_info") async def set_mataa(_, m): if len(m.command) == 1: - return await m.reply(f"Use /{m.command[0]} on, to enable sangmata. If you want disable, you can use off parameter.") + return await kirimPesan(m, f"Use /{m.command[0]} on, to enable sangmata. If you want disable, you can use off parameter.") if m.command[1] == "on": cekset = await is_sangmata_on(m.chat.id) if cekset: - await m.reply("SangMata already enabled in your groups.") + await kirimPesan(m, "SangMata already enabled in your groups.") else: await sangmata_on(m.chat.id) - await m.reply("Sangmata enabled in your groups.") + await kirimPesan(m, "Sangmata enabled in your groups.") elif m.command[1] == "off": cekset = await is_sangmata_on(m.chat.id) if cekset: - await m.reply("SangMata already enabled in your groups.") + await kirimPesan(m, "SangMata already enabled in your groups.") else: await sangmata_off(m.chat.id) - await m.reply("Sangmata enabled in your groups.") + await kirimPesan(m, "Sangmata enabled in your groups.") else: - await m.reply("Unknown parameter, use only on/off parameter.") \ No newline at end of file + await kirimPesan(m, "Unknown parameter, use only on/off parameter.") \ No newline at end of file diff --git a/misskaty/plugins/sub_extractor.py b/misskaty/plugins/sub_extractor.py index 6fd3887f..6087f75e 100644 --- a/misskaty/plugins/sub_extractor.py +++ b/misskaty/plugins/sub_extractor.py @@ -17,6 +17,7 @@ from pyrogram import filters from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup from misskaty import app +from misskaty.core.message_utils import * from misskaty.core.decorator.errors import capture_err from misskaty.helper.pyro_progress import progress_for_pyrogram from misskaty.helper.tools import get_random_string @@ -64,10 +65,10 @@ def get_subname(lang, url, format): async def ceksub(_, m): cmd = m.text.split(" ", 1) if len(cmd) == 1: - return await m.reply(f"Gunakan command /{m.command[0]} [link] untuk mengecek subtitle dan audio didalam video.") + return await kirimPesan(m, f"Please use command /{m.command[0]} [link] to check subtitles or audio in video file.", quote=True) link = cmd[1] start_time = perf_counter() - pesan = await m.reply("Sedang memproses perintah..", quote=True) + pesan = await kirimPesan(m, "Processing your request..", quote=True) try: res = (await shell_exec(f"ffprobe -loglevel 0 -print_format json -show_format -show_streams {link}"))[0] details = json.loads(res) @@ -96,13 +97,13 @@ async def ceksub(_, m): end_time = perf_counter() timelog = "{:.2f}".format(end_time - start_time) + " second" buttons.append([InlineKeyboardButton("❌ Cancel", f"close#{m.from_user.id}")]) - await pesan.edit( + await editPesan( + pesan, f"Press the button below to extract subtitles/audio. Only support direct link at this time.\nProcessed in {timelog}", reply_markup=InlineKeyboardMarkup(buttons), ) - except Exception: - traceback.format_exc() - await pesan.edit("Failed extract media, make sure your link is not protected by WAF or maybe inaccessible for bot.") + except: + await editPesan(pesan, "Failed extract media, make sure your link is not protected by WAF or maybe inaccessible for bot.") @app.on_message(filters.command(["converttosrt"], COMMAND_HANDLER)) @@ -110,8 +111,8 @@ async def ceksub(_, m): async def convertsrt(c, m): reply = m.reply_to_message if not reply and reply.document and (reply.document.file_name.endswith(".vtt") or reply.document.file_name.endswith(".ass")): - return await m.reply(f"Use command /{m.command[0]} by reply to .ass or .vtt file, to convert subtitle from .ass or .vtt to srt.") - msg = await m.reply("⏳ Converting...") + return await kirimPesan(m, f"Use command /{m.command[0]} by reply to .ass or .vtt file, to convert subtitle from .ass or .vtt to srt.") + msg = await kirimPesan(m, "⏳ Converting...", quote=True) dl = await reply.download() filename = dl.split("/", 3)[3] LOGGER.info(f"ConvertSub: {filename} by {m.from_user.first_name} [{m.from_user.id}]") @@ -124,7 +125,7 @@ async def convertsrt(c, m): progress=progress_for_pyrogram, progress_args=("Uploading files..", msg, c_time), ) - await msg.delete() + await hapusPesan(msg) try: os.remove(dl) os.remove(f"{filename}.srt") @@ -143,7 +144,7 @@ async def stream_extract(bot, update): link = update.message.reply_to_message.command[1] except: return await update.answer("⚠️ DONT DELETE YOUR MESSAGE!", True) - await update.message.edit("⏳ Processing...") + await editPesan(update.message, "⏳ Processing...") try: if codec == "aac": format = "aac" @@ -168,10 +169,10 @@ async def stream_extract(bot, update): progress=progress_for_pyrogram, progress_args=("Uploading files..", update.message, c_time), ) - await update.message.delete() + await hapusPesan(update.message) try: os.remove(namafile) except: pass except Exception as e: - await update.message.edit(f"Failed extract sub, Maybe unsupported format..\n\nLink: {link}\nERR: {e}") + await editPesan(update.message, f"Failed extract sub, Maybe unsupported format..\n\nLink: {link}\nERR: {e}") diff --git a/misskaty/plugins/web_scraper.py b/misskaty/plugins/web_scraper.py index 01b761c7..275d4c78 100644 --- a/misskaty/plugins/web_scraper.py +++ b/misskaty/plugins/web_scraper.py @@ -129,7 +129,7 @@ async def getDataPahe(msg, kueri, CurrentPage): async def getDataKuso(msg, kueri, CurrentPage, user): if not SCRAP_DICT.get(msg.id): kusodata = [] - data = await http.get(f'https://kusonime.com/?s={kueri}', headers=headers) + data = await http.get(f'https://kusonime.com/?s={kueri}', headers=headers, verify=False) res = BeautifulSoup(data.text, "lxml").find_all("h2", {"class": "episodeye"}) for i in res: ress = i.find_all("a")[0] @@ -168,7 +168,7 @@ async def getDataKuso(msg, kueri, CurrentPage, user): async def getDataMovieku(msg, kueri, CurrentPage): if not SCRAP_DICT.get(msg.id): moviekudata = [] - data = await http.get(f'https://107.152.37.223/?s={kueri}', headers=headers) + data = await http.get(f'https://107.152.37.223/?s={kueri}', headers=headers, verify=False) r = BeautifulSoup(data.text, "lxml") res = r.find_all(class_="bx") for i in res: @@ -199,7 +199,7 @@ async def getDataMovieku(msg, kueri, CurrentPage): async def getDataSavefilm21(msg, kueri, CurrentPage, user): if not SCRAP_DICT.get(msg.id): sfdata = [] - data = await http.get(f'https://185.99.135.215/?s={kueri}', headers=headers) + data = await http.get(f'https://185.99.135.215/?s={kueri}', headers=headers, verify=False) text = BeautifulSoup(data.text, "lxml") entry = text.find_all(class_="entry-header") if "Tidak Ditemukan" in entry[0].text: