# █▀▀ ▄▀█   █▀▄▀█ █▀█ █▀▄ █▀ # █▀░ █▀█   █░▀░█ █▄█ █▄▀ ▄█ # https://t.me/famods # 🔒 Licensed under the GNU AGPLv3 # 🌐 https://www.gnu.org/licenses/agpl-3.0.html # --------------------------------------------------------------------------------- # Name: Hetsu # Description: Search and install modules easily. # meta developer: @FAmods # meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/hetsu.png?raw=true # requires: aiohttp # --------------------------------------------------------------------------------- import re import asyncio import aiohttp import logging from telethon import types, functions from .. import loader, utils logger = logging.getLogger(__name__) @loader.tds class Hetsu(loader.Module): """Search and install modules easily.""" strings = { "name": "Hetsu", "no_q": " You need to write {}hetsu [query]", "inline_no_q": " Enter query.", "no_modules": "❌ No modules founded.", "searching": """🔍 Hetsu searching... 🛡 Searching above 900+ modules. All modules are safety and clearly moderated.""", "module": """⭐️ Module {module_name} {developer} 🔖 Ratio: {ratio} 🔎 Query: {query} ℹ️ Description: {description} 💻 Source code: click ⬇️ {prefix}dlm {link}""", } def __init__(self): self.config = loader.ModuleConfig( loader.ConfigValue( "limit", 5, lambda: "Max results of modules.", ), ) async def client_ready(self, client, db): self.db = db self._client = client @loader.command() async def hetsucmd(self, message): """Search module""" q = utils.get_args_raw(message) if not q: return await utils.answer(message, self.strings["no_q"].format(self.get_prefix())) await utils.answer(message, self.strings['searching']) q_default = q if not bool(re.fullmatch(r"[A-Za-z\s\d\W]+", q)): q = await self._client( functions.messages.TranslateTextRequest( peer=False, id=False, text=[ types.TextWithEntities( q_default, [], ) ], to_lang="en", ) ) q = q.result[0].text logger.info(q) async with aiohttp.ClientSession() as session: async with session.get( "https://hetsu.fajox.one/api/search", params={ "q": q, "limit": 1, } ) as response: modules = (await response.json())['results'] if not modules: return await utils.answer(message, self.strings['no_modules']) module = modules[0] module_text = self.strings['module'].format( module_name=module['name'], developer=f"by {module['developer']}" if module['developer'] else "", ratio=module['ratio'], query=q_default, description=module['description'] if module['description'] else "No description.", link=module['link'], prefix=self.get_prefix() ) if module['banner']: return await utils.answer_file( message, module['banner'], caption=module_text, ) else: return await utils.answer( message, module_text ) @loader.inline_handler() async def hetsu(self, query): """Search module""" q = query.args if not q: return { "title": "No query", "description": "Enter query for search module", "thumb": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Flat_cross_icon.svg/1024px-Flat_cross_icon.svg.png", "message": self.strings['inline_no_q'], } q_default = q if not bool(re.fullmatch(r"[A-Za-z\s\d\W]+", q)): q = await self._client( functions.messages.TranslateTextRequest( peer=False, id=False, text=[ types.TextWithEntities( q, [], ) ], to_lang="en", ) ) q = str(q) async with aiohttp.ClientSession() as session: async with session.get( "https://hetsu.fajox.one/api/search", params={ "q": q, "limit": self.config['limit'], } ) as response: modules = (await response.json())['results'] if not modules: return { "title": "No modules", "description": "No modules founded with this query.", "thumb": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Flat_cross_icon.svg/1024px-Flat_cross_icon.svg.png", "message": self.strings['no_modules'], } answer = [] for module in modules: answer.append({ "title": module['name'], "description": module['description'] if module['description'] else "No description.", "thumb": "https://img.icons8.com/m_outlined/512/FFFFFF/info.png", "message": self.strings['module'].format( module_name=module['name'], developer=f"by {module['developer']}" if module['developer'] else "", ratio=module['ratio'], query=q_default, description=module['description'] if module['description'] else "No description.", link=module['link'], prefix=self.get_prefix() ), }) return answer