diff --git a/.deepsource.toml b/.deepsource.toml index 1ef920fb..f4bfc56c 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -2,12 +2,12 @@ version = 1 [[analyzers]] name = "python" +enabled = true +dependency_file_paths = ["requirements.txt"] [analyzers.meta] runtime_version = "3.x.x" - -[[transformers]] -name = "black" - + max_line_length = 100 + [[transformers]] name = "isort" \ No newline at end of file diff --git a/.pep8speaks.toml b/.pep8speaks.toml new file mode 100644 index 00000000..8b373469 --- /dev/null +++ b/.pep8speaks.toml @@ -0,0 +1,15 @@ +# File : .pep8speaks.yml + +scanner: + linter: flake8 + +flake8: + max-line-length: 100 + ignore: + - W503 # line break before binary operator + +message: + opened: + header: "@{name}, Thanks for opening this PR." + updated: + header: "@{name}, Thanks for updating this PR." \ No newline at end of file diff --git a/database/__init__.py b/database/__init__.py index 0c56b527..dcbdfa0a 100644 --- a/database/__init__.py +++ b/database/__init__.py @@ -4,9 +4,8 @@ * @projectName MissKatyPyro * Copyright @YasirPedia All rights reserved """ -from motor.motor_asyncio import AsyncIOMotorClient as MongoClient +from async_pymongo import AsyncClient +from misskaty.vars import DATABASE_URI, DATABASE_NAME -from misskaty.vars import DATABASE_URI - -mongo = MongoClient(DATABASE_URI) -dbname = mongo.MissKatyDB +mongo = AsyncClient(DATABASE_URI) +dbname = mongo[DATABASE_NAME] diff --git a/database/afk_db.py b/database/afk_db.py index 5a6062e5..87644745 100644 --- a/database/afk_db.py +++ b/database/afk_db.py @@ -10,8 +10,8 @@ from database import dbname -usersdb = dbname.users -cleandb = dbname.cleanmode +usersdb = dbname["users"] +cleandb = dbname["cleanmode"] cleanmode = {} diff --git a/database/filters_db.py b/database/filters_db.py index fba5983b..66ac2004 100644 --- a/database/filters_db.py +++ b/database/filters_db.py @@ -2,7 +2,7 @@ from typing import Dict, List, Union from database import dbname -filtersdb = dbname.filters +filtersdb = dbname["filters"] async def _get_filters(chat_id: int) -> Dict[str, int]: diff --git a/database/gban_db.py b/database/gban_db.py index c7b5352c..05c455fd 100644 --- a/database/gban_db.py +++ b/database/gban_db.py @@ -1,6 +1,6 @@ from database import dbname -gbansdb = dbname.gban +gbansdb = dbname["gban"] async def is_gbanned_user(user_id: int) -> bool: diff --git a/database/imdb_db.py b/database/imdb_db.py index 90b840c6..f1ed2a78 100644 --- a/database/imdb_db.py +++ b/database/imdb_db.py @@ -1,6 +1,6 @@ from database import dbname -imbd_db = dbname.imdb +imbd_db = dbname["imdb"] async def is_imdbset(user_id: int) -> bool: diff --git a/database/karma_db.py b/database/karma_db.py index 5b7b19a0..a3c8ab31 100644 --- a/database/karma_db.py +++ b/database/karma_db.py @@ -3,7 +3,7 @@ from typing import Dict, Union from database import dbname from misskaty.helper.functions import int_to_alpha -karmadb = dbname.karma +karmadb = dbname["karma"] async def get_karmas_count() -> dict: diff --git a/database/locale_db.py b/database/locale_db.py index 39bbd318..d6823b54 100644 --- a/database/locale_db.py +++ b/database/locale_db.py @@ -4,7 +4,7 @@ from pyrogram.enums import ChatType from database import dbname -localesdb = dbname.locale # DB for localization +localesdb = dbname["locale"] # DB for localization group_types: Iterable[ChatType] = (ChatType.GROUP, ChatType.SUPERGROUP) diff --git a/database/notes_db.py b/database/notes_db.py index 89761702..e21432be 100644 --- a/database/notes_db.py +++ b/database/notes_db.py @@ -2,7 +2,7 @@ from typing import Dict, List, Union from database import dbname -notesdb = dbname.notes +notesdb = dbname["notes"] async def _get_notes(chat_id: int) -> Dict[str, int]: diff --git a/database/sangmata_db.py b/database/sangmata_db.py index 1ad76ac9..813355e0 100644 --- a/database/sangmata_db.py +++ b/database/sangmata_db.py @@ -1,6 +1,6 @@ from database import dbname -matadb = dbname.sangmata +matadb = dbname["sangmata"] # Get Data User diff --git a/database/users_chats_db.py b/database/users_chats_db.py index ce42892f..16ea6a3b 100644 --- a/database/users_chats_db.py +++ b/database/users_chats_db.py @@ -1,14 +1,13 @@ -import motor.motor_asyncio - +from async_pymongo import AsyncClient from misskaty.vars import DATABASE_NAME, DATABASE_URI -class Database: +class UsersData: def __init__(self, uri, database_name): - self._client = motor.motor_asyncio.AsyncIOMotorClient(uri) + self._client = AsyncClient(uri) self.db = self._client[database_name] - self.col = self.db.users - self.grp = self.db.groups + self.col = self.db["users"] + self.grp = self.db["groups"] @staticmethod def new_user(id, name): @@ -109,4 +108,4 @@ class Database: return (await self.db.command("dbstats"))["dataSize"] -db = Database(DATABASE_URI, DATABASE_NAME) +db = UsersData(DATABASE_URI, DATABASE_NAME) diff --git a/database/warn_db.py b/database/warn_db.py index 122cacf7..64ab6063 100644 --- a/database/warn_db.py +++ b/database/warn_db.py @@ -2,7 +2,7 @@ from typing import Dict, Union from database import dbname -warnsdb = dbname.warn +warnsdb = dbname["warn"] async def get_warns_count() -> dict: diff --git a/misskaty/__init__.py b/misskaty/__init__.py index d0aa5f17..d64b5f70 100644 --- a/misskaty/__init__.py +++ b/misskaty/__init__.py @@ -8,7 +8,6 @@ from logging import ERROR, INFO, StreamHandler, basicConfig, getLogger, handlers from apscheduler.jobstores.mongodb import MongoDBJobStore from apscheduler.schedulers.asyncio import AsyncIOScheduler from async_pymongo import AsyncClient -from motor.motor_asyncio import AsyncIOMotorClient from pymongo import MongoClient from pyrogram import Client @@ -41,7 +40,7 @@ MOD_NOLOAD = ["subscene_dl"] HELPABLE = {} cleanmode = {} botStartTime = time.time() -misskaty_version = "v2.9.1 - Stable" +misskaty_version = "v2.9.2 - Stable" # Pyrogram Bot Client app = Client( diff --git a/misskaty/__main__.py b/misskaty/__main__.py index 85cf4493..d01082a4 100644 --- a/misskaty/__main__.py +++ b/misskaty/__main__.py @@ -48,7 +48,7 @@ async def start_bot(): LOGGER.info("+===============+===============+===============+===============+") LOGGER.info(bot_modules) LOGGER.info("+===============+===============+===============+===============+") - LOGGER.info(f"[INFO]: BOT STARTED AS @{BOT_USERNAME}!") + LOGGER.info("[INFO]: BOT STARTED AS @%s!", BOT_USERNAME) try: LOGGER.info("[INFO]: SENDING ONLINE STATUS") diff --git a/misskaty/core/decorator/misc.py b/misskaty/core/decorator/misc.py index e7c1b3e0..73c2cf0a 100644 --- a/misskaty/core/decorator/misc.py +++ b/misskaty/core/decorator/misc.py @@ -1,6 +1,7 @@ -import asyncio +import asyncio, logging from functools import wraps +LOGGER = logging.getLogger(__name__) def asyncify(func): async def inner(*args, **kwargs): @@ -18,6 +19,6 @@ def new_task(func): loop = asyncio.get_running_loop() return loop.create_task(func(*args, **kwargs)) except Exception as e: - LOGGER.error(f"Failed to create task for {func.__name__} : {e}") + LOGGER.error(f"Failed to create task for {func.__name__} : {e}") # skipcq: PYL-E0602 return wrapper diff --git a/misskaty/helper/functions.py b/misskaty/helper/functions.py index b8f00f2c..3b5d2c8b 100644 --- a/misskaty/helper/functions.py +++ b/misskaty/helper/functions.py @@ -5,6 +5,8 @@ from string import ascii_lowercase from pyrogram import enums +from misskaty import app + def get_urls_from_text(text: str) -> bool: regex = r"""(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-] @@ -47,7 +49,6 @@ async def extract_userid(message, text: str): return int(text) entities = message.entities - app = message._client if len(entities) < 2: return (await app.get_users(text)).id entity = entities[1] diff --git a/misskaty/helper/kuso_utils.py b/misskaty/helper/kuso_utils.py index 5c007712..a3d061e5 100644 --- a/misskaty/helper/kuso_utils.py +++ b/misskaty/helper/kuso_utils.py @@ -140,9 +140,8 @@ async def kusonimeBypass(url: str, slug=None): err = traceback.format_exc() LOGGER.error(err) result |= {"error": True, "error_message": err} - finally: - await http.delete(_url) - return result + await http.delete(_url) + return result async def byPassPh(url: str, name: str): diff --git a/misskaty/helper/misc.py b/misskaty/helper/misc.py index 8c9b2cc0..d80a94d4 100644 --- a/misskaty/helper/misc.py +++ b/misskaty/helper/misc.py @@ -5,6 +5,7 @@ from pyrogram.types import InlineKeyboardButton from misskaty import MOD_LOAD, MOD_NOLOAD +# skipcq: PYL-W1641 class EqInlineKeyboardButton(InlineKeyboardButton): def __eq__(self, other): return self.text == other.text diff --git a/misskaty/plugins/admin.py b/misskaty/plugins/admin.py index ef16f70c..70238ba1 100644 --- a/misskaty/plugins/admin.py +++ b/misskaty/plugins/admin.py @@ -854,7 +854,7 @@ async def set_chat_photo(self: Client, ctx: Message): if file.file_size > 5000000: return await ctx.reply("File size too large.") - file = await reply.download() + photo = await reply.download() try: await ctx.chat.set_photo(photo=photo) await ctx.reply_text("Successfully Changed Group Photo") diff --git a/misskaty/plugins/ban_user_or_chat.py b/misskaty/plugins/ban_user_or_chat.py index 8a1f7c99..1b091032 100644 --- a/misskaty/plugins/ban_user_or_chat.py +++ b/misskaty/plugins/ban_user_or_chat.py @@ -1,5 +1,5 @@ from pyrogram import Client, filters -from pyrogram.errors import ChannelPrivate +from pyrogram.errors import ChannelPrivate, PeerIdInvalid from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message from database.users_chats_db import db diff --git a/misskaty/plugins/download_upload.py b/misskaty/plugins/download_upload.py index 6d13dac0..08a8baa1 100644 --- a/misskaty/plugins/download_upload.py +++ b/misskaty/plugins/download_upload.py @@ -111,7 +111,7 @@ async def download(client, message): try: downloader.start(blocking=False) except Exception as err: - return await ctx.edit(str(err)) + return await message.edit_msg(str(err)) c_time = time.time() while not downloader.isFinished(): total_length = downloader.filesize or None diff --git a/misskaty/plugins/grup_tools.py b/misskaty/plugins/grup_tools.py index 7f29d7c4..d275867c 100644 --- a/misskaty/plugins/grup_tools.py +++ b/misskaty/plugins/grup_tools.py @@ -133,25 +133,6 @@ async def member_has_joined(c: app, member: ChatMemberUpdated, strings): except Exception as e: LOGGER.info(e) userspammer = "" - # Spamwatch Detection - try: - headers = { - "Authorization": "Bearer XvfzE4AUNXkzCy0DnIVpFDlxZi79lt6EnwKgBj8Quuzms0OSdHvf1k6zSeyzZ_lz" - } - apispamwatch = ( - await http.get( - f"https://api.spamwat.ch/banlist/{user.id}", headers=headers - ) - ).json() - if not apispamwatch.get("error"): - await app.ban_chat_member( - member.chat.id, user.id, datetime.now() + timedelta(seconds=30) - ) - userspammer += strings("spamwatch_msg").format( - umention=user.mention, uid=user.id, reas=apispamwatch.get("reason") - ) - except Exception as err: - LOGGER.error(f"ERROR in Spamwatch Detection. {err}") # Combot API Detection try: apicombot = ( @@ -202,25 +183,6 @@ async def greet_group(bot, message, strings): ), ) 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 += strings("spamwatch_msg").format( - umention=u.mention, uid=u.id, reas=apispamwatch.get("reason") - ) - except Exception as err: - LOGGER.error(f"ERROR in Spamwatch Detection. {err}") # Combot API Detection try: apicombot = ( diff --git a/misskaty/plugins/imdb_search.py b/misskaty/plugins/imdb_search.py index 7b163bed..d3194976 100644 --- a/misskaty/plugins/imdb_search.py +++ b/misskaty/plugins/imdb_search.py @@ -649,7 +649,7 @@ async def imdb_en_callback(self: Client, query: CallbackQuery): for i in r_json["creator"] if i["@type"] == "Person" ) - res_str += f"Writer: {creator[-2]}\n" + res_str += f"Writer: {creator[:-2]}\n" if r_json.get("actor"): actors = actors = "".join( f"{i['name']}, " for i in r_json["actor"] diff --git a/misskaty/plugins/inline_search.py b/misskaty/plugins/inline_search.py index a364d1ed..33e715e0 100644 --- a/misskaty/plugins/inline_search.py +++ b/misskaty/plugins/inline_search.py @@ -11,24 +11,20 @@ from sys import version as pyver from bs4 import BeautifulSoup from deep_translator import GoogleTranslator -from motor import version as mongover from pykeyboard import InlineButton, InlineKeyboard from pyrogram import __version__ as pyrover from pyrogram import enums, filters from pyrogram.errors import MessageIdInvalid, MessageNotModified -from pyrogram.types import ( - InlineKeyboardButton, - InlineKeyboardMarkup, - InlineQuery, - InlineQueryResultArticle, - InlineQueryResultPhoto, - InputTextMessageContent, -) +from pyrogram.types import (InlineKeyboardButton, InlineKeyboardMarkup, + InlineQuery, InlineQueryResultArticle, + InlineQueryResultPhoto, InputTextMessageContent) from misskaty import BOT_USERNAME, app, user from misskaty.core.decorator.ratelimiter import ratelimiter from misskaty.helper import GENRES_EMOJI, http, post_to_telegraph, search_jw +from misskaty.plugins.dev import shell_exec from misskaty.plugins.misc_tools import get_content +from misskaty.vars import USER_SESSION from utils import demoji __MODULE__ = "InlineFeature" @@ -50,6 +46,7 @@ LOGGER = getLogger() @app.on_inline_query() async def inline_menu(_, inline_query: InlineQuery): if inline_query.query.strip().lower().strip() == "": + aspymon_ver = (await shell_exec("pip freeze | grep async-pymongo"))[0] buttons = InlineKeyboard(row_width=2) buttons.add( *[ @@ -59,8 +56,8 @@ async def inline_menu(_, inline_query: InlineQuery): ) btn = InlineKeyboard(row_width=2) - bot_state = "Alive" if await app.get_me() else "Dead" - ubot_state = "Alive" if await user.get_me() else "Dead" + bot_state = "Alive" if USER_SESSION and await app.get_me() else "Dead" + ubot_state = "Alive" if USER_SESSION and await user.get_me() else "Dead" btn.add( InlineKeyboardButton("Stats", callback_data="stats_callback"), InlineKeyboardButton("Go Inline!", switch_inline_query_current_chat=""), @@ -68,14 +65,16 @@ async def inline_menu(_, inline_query: InlineQuery): msg = f""" **[MissKaty✨](https://github.com/yasirarism):** -**MainBot:** `{bot_state}` -**UserBot:** `{ubot_state}` +**MainBot Stats:** `{bot_state}` +**UserBot Stats:** `{ubot_state}` **Python:** `{pyver.split()[0]}` **Pyrogram:** `{pyrover}` -**MongoDB:** `{mongover}` +**MongoDB:** `{aspymon_ver}` **Platform:** `{platform}` -**Profiles:** {(await app.get_me()).username} | {(await user.get_me()).first_name} - """ +**Bot:** {(await app.get_me()).first_name} +""" + if USER_SESSION: + msg += f"**UserBot:** {(await user.get_me()).first_name}" answerss = [ InlineQueryResultArticle( title="Inline Commands", @@ -166,6 +165,7 @@ async def inline_menu(_, inline_query: InlineQuery): reply_markup=buttons, ) ) + is_img = False for types in parsetypes: if kueri.lower() in types.lower(): link = parsetypes[types]["href"] @@ -191,7 +191,7 @@ async def inline_menu(_, inline_query: InlineQuery): body_text = f"""
{msg}
"""
- msg = await post_to_telegraph(False, method, body_text)
+ msg = await post_to_telegraph(is_img, method, body_text)
datajson.append(
InlineQueryResultArticle(
title=types,
diff --git a/misskaty/plugins/media_extractor.py b/misskaty/plugins/media_extractor.py
index 09bbd4eb..33e00f29 100644
--- a/misskaty/plugins/media_extractor.py
+++ b/misskaty/plugins/media_extractor.py
@@ -13,12 +13,8 @@ from time import time
from urllib.parse import unquote
from pyrogram import Client, filters
-from pyrogram.types import (
- CallbackQuery,
- InlineKeyboardButton,
- InlineKeyboardMarkup,
- Message,
-)
+from pyrogram.types import (CallbackQuery, InlineKeyboardButton,
+ InlineKeyboardMarkup, Message)
from misskaty import app
from misskaty.core.decorator.errors import capture_err
@@ -131,7 +127,7 @@ async def convertsrt(self: Client, ctx: Message, strings):
filename = dl.split("/", 3)[3]
LOGGER.info(f"ConvertSub: {filename} by {ctx.from_user.first_name if ctx.from_user else ctx.sender_chat.title} [{ctx.from_user.id if ctx.from_user else ctx.sender_chat.id}]")
suffix = "srt" if ctx.command[0] == "converttosrt" else "ass"
- (await shell_exec(f"ffmpeg -i '{dl}' 'downloads/{filename}.{suffix}'"))[0]
+ (await shell_exec(f"ffmpeg -i '{dl}' 'downloads/{filename}.{suffix}'"))[0] # skipcq: PYL-W0106
c_time = time()
await ctx.reply_document(
f"downloads/{filename}.{suffix}",
@@ -156,7 +152,7 @@ async def stream_extract(self: Client, update: CallbackQuery, strings):
usr = update.message.reply_to_message
if update.from_user.id != usr.from_user.id:
return await update.answer(strings("unauth_cb"), True)
- _, lang, map, codec = cb_data.split("#")
+ _, lang, map_code, codec = cb_data.split("#")
try:
link = update.message.reply_to_message.command[1]
except:
@@ -174,7 +170,7 @@ async def stream_extract(self: Client, update: CallbackQuery, strings):
namafile = get_subname(lang, link, ext)
try:
LOGGER.info(f"ExtractSub: {namafile} by {update.from_user.first_name} [{update.from_user.id}]")
- (await shell_exec(f"ffmpeg -i {link} -map {map} '{namafile}'"))[0]
+ (await shell_exec(f"ffmpeg -i {link} -map {map_code} '{namafile}'"))[0]
timelog = time() - start_time
c_time = time()
await update.message.reply_document(
diff --git a/misskaty/plugins/web_scraper.py b/misskaty/plugins/web_scraper.py
index f52c85ae..44ba5c12 100644
--- a/misskaty/plugins/web_scraper.py
+++ b/misskaty/plugins/web_scraper.py
@@ -44,7 +44,7 @@ headers = {
LOGGER = logging.getLogger(__name__)
SCRAP_DICT = TTLCache(maxsize=1000, ttl=1800)
data_kuso = TTLCache(maxsize=1000, ttl=1800)
-webdb = dbname.web
+webdb = dbname["web"]
web = {
"yasirapi": "https://yasirapi.eu.org",
diff --git a/requirements.txt b/requirements.txt
index 5cae3125..fd9efcc8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,7 +4,6 @@ tgcrypto
async_pymongo
pymongo
python-dotenv
-motor[srv]>=3.1.2
requests
bs4
aiohttp