From 29fb79621820efb2c9a8bf72f990030a39a0d100 Mon Sep 17 00:00:00 2001 From: Who? <155328415+coddrago@users.noreply.github.com> Date: Sat, 23 Nov 2024 20:44:23 +0700 Subject: [PATCH] Fix Fheta --- hikka/modules/fheta.py | 356 +++++++++++++++++++---------------------- 1 file changed, 163 insertions(+), 193 deletions(-) diff --git a/hikka/modules/fheta.py b/hikka/modules/fheta.py index 60d8cc4..9356014 100644 --- a/hikka/modules/fheta.py +++ b/hikka/modules/fheta.py @@ -1,6 +1,15 @@ -__version__ = (3, 3, 5) +__version__ = (6, 6, 6) + +# ███████╗██╗ ██╗███████╗████████╗█████╗ +# ██╔════╝██║ ██║██╔════╝╚══██╔══╝██╔══██╗ +# █████╗ ███████║█████╗ ██║ ███████║ +# ██╔══╝ ██╔══██║██╔══╝ ██║ ██╔══██║ +# ██║ ██║ ██║███████╗ ██║ ██║ ██║ + # meta developer: @Foxy437 -# change-log: 🎉🎉🎉🎉🎉🎉🎉🎉 ADDED INLINE!!! ADDED UKRAINIAN!!! +# change-log: ????????? +# meta banner: https://camo.githubusercontent.com/5091a8298e4c92787a9aabf61f5a5797ac01b9bc0fd08b44fc54b1f8dfd6cc60/68747470733a2f2f692e696d67686970706f2e636f6d2f66696c65732f5967473232303844674d2e6a7067 +# meta pic: https://camo.githubusercontent.com/5091a8298e4c92787a9aabf61f5a5797ac01b9bc0fd08b44fc54b1f8dfd6cc60/68747470733a2f2f692e696d67686970706f2e636f6d2f66696c65732f5967473232303844674d2e6a7067 # ©️ Fixyres, 2024 # 🌐 https://github.com/Fixyres/FHeta # Licensed under the Apache License, Version 2.0 (the "License"); @@ -34,14 +43,8 @@ class FHeta(loader.Module): "result": "🔎 Result {index} by query: {query}\n{module_name} by {author}\n🖥 Repository: {repo_url}\n💾 Command for installation: {install_command}{description}{commands}\n\n\n", "fetch_failed": " Error.", "closest_match": "🔎 Result by query: {query}\n{module_name} by {author}\n🖥 Repository: {repo_url}\n💾 Command for installation: {install_command}{description}{commands}\n\n\n", - "inline_no_query": "Enter a query to search.", - "inline_no_modules_found": "No modules found.", - "inline_commands": "\n👨‍💻 Commands:\n{commands_list}", - "inline_description": "\n📁 Description: {description}", - "inline_result": "{module_name} by {author}\n🖥️ Repository: {repo_url}\n💾 Command for installation: {install_command}{description}{commands}\n\n\n", - "inline_descriptioon": "{description}", - "inline_no_modules_foound": "Try another request.", - "inline_noo_query": "Name, command, description, author." + "inline_commandss": "\n🤖 Inline commands:\n{inline_list}", + "language": "en_doc" } strings_ru = { @@ -54,14 +57,8 @@ class FHeta(loader.Module): "result": "🔎 Результат {index} по запросу: {query}\n{module_name} от {author}\n🖥 Репозиторий: {repo_url}\n💾 Команда для установки: {install_command}{description}{commands}\n\n\n", "fetch_failed": " Ошибка.", "closest_match": "🔎 Результат по запросу: {query}\n{module_name} от {author}\n🖥 Репозиторий: {repo_url}\n💾 Команда для установки: {install_command}{description}{commands}\n\n\n", - "inline_no_query": "Введите запрос для поиска.", - "inline_no_modules_found": "Модули не найдены.", - "inline_commands": "\n👨‍💻 Команды:\n{commands_list}", - "inline_description": "\n📁 Описание: {description}", - "inline_result": "{module_name} от {author}\n🖥️ Репозиторий: {repo_url}\n💾 Команда для установки: {install_command}{description}{commands}\n\n\n", - "inline_descriptioon": "{description}", - "inline_no_modules_foound": "Попробуйте другой запрос.", - "inline_noo_query": "Название, команда, описание, автор." + "inline_commandss": "\n🤖 Инлайн команды:\n{inline_list}", + "language": "ru_doc" } strings_ua = { @@ -74,14 +71,8 @@ class FHeta(loader.Module): "result": "🔎 Результат {index} за запитом: {query}\n{module_name} від {author}\n🖥 Репозиторій: {repo_url}\n💾 Команда для встановлення: {install_command}{description}{commands}\n\n\n", "fetch_failed": " Помилка.", "closest_match": "🔎 Результат за запитом: {query}\n{module_name} від {author}\n🖥 Репозиторій: {repo_url}\n💾 Команда для встановлення: {install_command}{description}{commands}\n\n\n", - "inline_no_query": "Введіть запит для пошуку.", - "inline_no_modules_found": "Модулі не знайдені.", - "inline_commands": "\n👨‍💻 Команди:\n{commands_list}", - "inline_description": "\n📁 Опис: {description}", - "inline_result": "{module_name} від {author}\n🖥️ Репозиторій: {repo_url}\n💾 Команда для встановлення: {install_command}{description}{commands}\n\n\n", - "inline_descriptioon": "{description}", - "inline_no_modules_foound": "Спробуйте інший запит.", - "inline_noo_query": "Назва, команда, опис, автор." + "inline_commandss": "\n🤖 Інлайн команди:\n{inline_list}", + "language": "ua_doc" } @loader.command(ru_doc="(запрос) - искать модули.", ua_doc="(запит) - шукати модулі.") @@ -92,7 +83,7 @@ class FHeta(loader.Module): await utils.answer(message, self.strings["no_query"]) return - await utils.answer(message, self.strings["search"]) + search_message = await utils.answer(message, self.strings["search"]) modules = await self.search_modules(args) if not modules: @@ -106,160 +97,84 @@ class FHeta(loader.Module): data = await response.text() all_modules = json.loads(data) - module_names = [module['name'] for module in all_modules] + module_names = [module['name'] for module in all_modules if 'name' in module] closest_matches = difflib.get_close_matches(args, module_names, n=1, cutoff=0.5) if closest_matches: closest_module = next((m for m in all_modules if m['name'] == closest_matches[0]), None) if closest_module: formatted_module = await self.format_module(closest_module, args) - await utils.answer(message, formatted_module) - return + banner_url = closest_module.get("banner", None) - await utils.answer(message, self.strings["no_modules_found"]) - else: - seen_modules = set() - formatted_modules = [] - result_index = 1 + if banner_url: + async with aiohttp.ClientSession() as session: + async with session.get(banner_url) as response: + if response.status == 200: + banner_data = await response.read() + file = io.BytesIO(banner_data) + file.name = "banner.jpg" + await message.client.send_file( + message.peer_id, + file, + caption=formatted_module, + reply_to=message.id + ) + await search_message.delete() + return - for module in modules: - try: - repo_url = f"https://github.com/{module['repo']}" - install = module['install'] + await utils.answer(search_message, formatted_module) + return - commands_section = "" - if "commands" in module and module['commands']: - commands_section = self.strings["commands"].format(commands_list="\n".join( - [f"{self.get_prefix()}{cmd['name']} {utils.escape_html(cmd['description'])}" for cmd in module['commands']] - )) - elif "commands" not in module or not module['commands']: - commands_section = "" - - description_section = "" - if "description" in module and module["description"]: - description_section = self.strings["description"].format(description=utils.escape_html(module["description"])) - elif "description" not in module or not module["description"]: - description_section = "" - - author_info = utils.escape_html(module.get("author", "???")) - module_name = utils.escape_html(module['name'].replace('.py', '')) - module_namee = utils.escape_html(module['name'].replace('.py', '').lower()) - module_key = f"{module_namee}_{author_info}" - - if module_key in seen_modules: - continue - seen_modules.add(module_key) - - result = self.strings["result"].format( - index=result_index, - query=args, - module_name=module_name, - author=author_info, - repo_url=repo_url, - install_command=f"{self.get_prefix()}{install}", - description=description_section, - commands=commands_section - ) - formatted_modules.append(result) - result_index += 1 - except Exception: - continue - - if len(formatted_modules) == 1: - closest_match_result = self.strings["closest_match"].format( - query=args, - module_name=module_name, - author=author_info, - repo_url=repo_url, - install_command=f"{self.get_prefix()}{install}", - description=description_section, - commands=commands_section - ) - await utils.answer(message, closest_match_result) - else: - results = "".join(formatted_modules) - await utils.answer(message, results) - - @loader.inline_handler(ru_doc="(запрос) - искать модули.", ua_doc="(запит) - шукати модулі.") - async def fheta(self, query: InlineQuery): - '''(query) - search modules.''' - args = query.args - if not args: - await query.answer( - [ - { - "type": "article", - "id": "no_query", - "title": self.strings["inline_no_query"], - "description": self.strings["inline_noo_query"], - "input_message_content": { - "message_text": self.strings["inline_no_query"], - "parse_mode": "HTML", - }, - "thumb_url": "https://raw.githubusercontent.com/Fixyres/FHeta/refs/heads/main/imgonline-com-ua-Resize-4EUHOHiKpwRTb4s.png", - } - ] - ) - return - - modules = await self.search_modules(args) - - if not modules: - modules = await self.search_modules(args.replace(" ", "")) - - if not modules: - url = "https://raw.githubusercontent.com/Fixyres/FHeta/refs/heads/main/modules.json" - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - data = await response.text() - all_modules = json.loads(data) - - module_names = [module['name'] for module in all_modules] - closest_matches = difflib.get_close_matches(args, module_names, n=3, cutoff=0.4) - - if closest_matches: - modules = [m for m in all_modules if m['name'] in closest_matches] - - if not modules: - await query.answer( - [ - { - "type": "article", - "id": "no_modules_found", - "title": self.strings["inline_no_modules_found"], - "description": self.strings["inline_no_modules_foound"], - "input_message_content": { - "message_text": self.strings["inline_no_modules_found"], - "parse_mode": "HTML", - }, - "thumb_url": "https://raw.githubusercontent.com/Fixyres/FHeta/refs/heads/main/imgonline-com-ua-Resize-KbaztxA3oS67p3m8.png", - } - ] - ) + await utils.answer(search_message, self.strings["no_modules_found"]) return seen_modules = set() - results = [] + formatted_modules = [] result_index = 1 - for module in modules: + current_language = self.strings.get("language", "doc") + + for module in modules[:50]: try: repo_url = f"https://github.com/{module['repo']}" install = module['install'] commands_section = "" - if "commands" in module and module['commands']: - commands_list = "\n".join( - [f"{self.get_prefix()}{cmd['name']} {utils.escape_html(cmd['description'])}" for cmd in module['commands']] - ) - commands_section = self.strings["inline_commands"].format(commands_list=commands_list) + inline_commands_section = "" + if "commands" in module and module['commands']: + normal_commands = [] + inline_commands = [] + + for cmd in module['commands']: + description = cmd.get('description', {}).get(current_language, cmd.get('description', {}).get("doc")) + + if isinstance(description, dict): + description = description.get('doc', '') + + if cmd.get("inline", False): + if description: + cmd_entry = f"@{self.inline.bot_username} {cmd['name']} {utils.escape_html(description)}" + else: + cmd_entry = f"@{self.inline.bot_username} {cmd['name']}" + inline_commands.append(cmd_entry) + else: + if description: + cmd_entry = f"{self.get_prefix()}{cmd['name']} {utils.escape_html(description)}" + else: + cmd_entry = f"{self.get_prefix()}{cmd['name']}" + normal_commands.append(cmd_entry) + + if normal_commands: + commands_section = self.strings["commands"].format(commands_list="\n".join(normal_commands)) + + if inline_commands: + inline_commands_section = self.strings["inline_commandss"].format( + inline_list="\n".join(inline_commands)) + description_section = "" - if "description" in module: - description_section = self.strings["inline_description"].format(description=utils.escape_html(module['description'])) - else: - description_section = "" + if "description" in module and module["description"]: + description_section = self.strings["description"].format(description=utils.escape_html(module["description"])) author_info = utils.escape_html(module.get("author", "???")) module_name = utils.escape_html(module['name'].replace('.py', '')) @@ -270,37 +185,64 @@ class FHeta(loader.Module): continue seen_modules.add(module_key) - results.append( - { - "type": "article", - "id": f"module_{result_index}", - "title": module_name, - "description": self.strings["inline_descriptioon"].format(description=module.get('description', utils.escape_html(module.get('author', '???')))), - "input_message_content": { - "message_text": self.strings["inline_result"].format( + thumb_url = module.get("banner", None) + result = self.strings["result"].format( + index=result_index, + query=args, + module_name=module_name, + author=author_info, + repo_url=repo_url, + install_command=f"{self.get_prefix()}{install}", + description=description_section, + commands=commands_section + inline_commands_section + ) + formatted_modules.append((result, thumb_url)) + result_index += 1 + except Exception: + continue + + if len(formatted_modules) == 1: + result_text, thumb_url = formatted_modules[0] + if thumb_url: + async with aiohttp.ClientSession() as session: + async with session.get(thumb_url) as response: + if response.status == 200: + banner_data = await response.read() + file = io.BytesIO(banner_data) + file.name = "banner.jpg" + closest_match_result = self.strings["closest_match"].format( query=args, module_name=module_name, author=author_info, repo_url=repo_url, install_command=f"{self.get_prefix()}{install}", description=description_section, - commands=commands_section, - ), - "parse_mode": "HTML", - "disable_web_page_preview": True, - }, - "thumb_url": "https://raw.githubusercontent.com/Fixyres/FHeta/refs/heads/main/imgonline-com-ua-Resize-SOMllzo0cPFUCor.png", - } - ) - result_index += 1 + commands=commands_section + inline_commands_section + ) + await message.client.send_file( + message.peer_id, + file, + caption=closest_match_result, + reply_to=message.id + ) + await search_message.delete() + return - if result_index > 50: - break - except Exception: - continue - - await query.answer(results) + closest_match_result = self.strings["closest_match"].format( + query=args, + module_name=module_name, + author=author_info, + repo_url=repo_url, + install_command=f"{self.get_prefix()}{install}", + description=description_section, + commands=commands_section + inline_commands_section + ) + await utils.answer(search_message, closest_match_result) + else: + results = "".join([item[0] for item in formatted_modules]) + await utils.answer(search_message, results) + async def search_modules(self, query: str): url = "https://raw.githubusercontent.com/Fixyres/FHeta/refs/heads/main/modules.json" async with aiohttp.ClientSession() as session: @@ -337,18 +279,46 @@ class FHeta(loader.Module): async def format_module(self, module, query): repo_url = f"https://github.com/{module['repo']}" install = module['install'] - + current_language = self.strings.get("language", "doc") commands_section = "" - if "commands" in module: - commands_list = "\n".join([f"{self.get_prefix()}{cmd['name']} {cmd['description']}" for cmd in module['commands']]) - commands_section = self.strings["commands"].format(commands_list=commands_list) + inline_commands_section = "" + + if "commands" in module and module['commands']: + normal_commands = [] + inline_commands = [] + + for cmd in module['commands']: + description = cmd.get('description', {}).get(current_language, cmd.get('description', {}).get("doc")) + + if isinstance(description, dict): + description = description.get('doc', '') + + if cmd.get("inline", False): + if description: + cmd_entry = f"@{self.inline.bot_username} {cmd['name']} {utils.escape_html(description)}" + else: + cmd_entry = f"@{self.inline.bot_username} {cmd['name']}" + inline_commands.append(cmd_entry) + else: + if description: + cmd_entry = f"{self.get_prefix()}{cmd['name']} {utils.escape_html(description)}" + else: + cmd_entry = f"{self.get_prefix()}{cmd['name']}" + normal_commands.append(cmd_entry) + + if normal_commands: + commands_section = self.strings["commands"].format(commands_list="\n".join(normal_commands)) + + if inline_commands: + inline_commands_section = self.strings["inline_commandss"].format( + inline_list="\n".join(inline_commands)) description_section = "" - if "description" in module: - description_section = self.strings["description"].format(description=module["description"]) + if "description" in module and module["description"]: + description_section = self.strings["description"].format(description=utils.escape_html(module["description"])) - author_info = module.get("author", "???") - module_name = module['name'].replace('.py', '') + author_info = utils.escape_html(module.get("author", "???")) + module_name = utils.escape_html(module['name'].replace('.py', '')) return self.strings["closest_match"].format( query=query, @@ -357,5 +327,5 @@ class FHeta(loader.Module): repo_url=repo_url, install_command=f"{self.get_prefix()}{install}", description=description_section, - commands=commands_section - ) + commands=commands_section + inline_commands_section + ) \ No newline at end of file