# ©️ Dan Gazizullin, 2021-2023 # This file is a part of Hikka Userbot # 🌐 https://github.com/hikariatama/Hikka # You can redistribute it and/or modify it under the terms of the GNU AGPLv3 # 🔑 https://www.gnu.org/licenses/agpl-3.0.html import difflib import inspect import io from hikkatl.tl.types import Message from .. import loader, utils from ..version import __version__ @loader.tds class NewMlMod(loader.Module): """A module for uploading modules as a file. Let's just say it's a heavily stripped-down UnitHeta.""" strings = { "name": "NewMlMod", "404": " Module not found", "not_exact": "⚠️ No exact match has been found, so the closest result is shown instead", "link": "🌐 Link of {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 File of {class_name}\n\n🌘 {prefix}lm in reply to this message to install\n\n{not_exact}", "args": " You must specify arguments", "_cmd_doc_ml": " - Send link to module" } strings_ru = { "404": " Модуль не найден", "not_exact": "⚠️ Точного совпадения не найдено, поэтому показан ближайший результат", "link": "🌐 Ссылка на {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 Файл {class_name}\n\n🌘 {prefix}lm в ответ на это сообщение, чтобы установить\n\n{not_exact}", "args": " Вы должны указать аргументы", "_cmd_doc_ml": "<имя модуля> - Отправить ссылку на модуль" } strings_uz = { "404": " Modul topilmadi", "not_exact": "⚠️ To'g'ri mos keladigan natija topilmadi, shuning uchun eng yaqin natija ko'rsatiladi", "link": "🌐 Havola bo'yicha {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 Fayl {class_name}\n\n🌘 {prefix}lm bu habarga javob qilib, uni o'rnatish uchun\n\n{not_exact}", "args": " Siz argumentlarni belgilamadingiz", "_cmd_doc_ml": " - Modulga havola yuborish" } strings_tt = { "404": " Модуль табылмады", "not_exact": "⚠️ Тулы тапкыр килгән нәтиҗәләр табылмады, сондыктан ең яңа нәтиҗә күрсәтелә", "link": "🌐 Сылтама өчен {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 Файл {class_name}\n\n🌘 {prefix}lm осы хәбәрне кабул килгәндә\n\n{not_exact}", "args": " Аргументларны күрсәтмәгәнсез", "_cmd_doc_ml": "<модуль исеме> - Модульга сылтама җибәрү" } strings_tr = { "404": " Modül bulunamadı", "not_exact": "⚠️ Herhangi bir tam eşleşme bulunamadığından, en yakın sonuç gösteriliyor", "link": "🌐 Bağlantı için {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 Dosya {class_name}\n\n🌘 {prefix}lm bu mesaja yanıt olarak yüklemek için\n\n{not_exact}", "args": " Argümanlar belirtmelisiniz", "_cmd_doc_ml": " - Modül bağlantısını gönder" } strings_kk = { "404": " Модуль табылмады", "not_exact": "⚠️ Толық сәйкес келетін нәтижелер табылмады, сондықтан ең жақын нәтиже көрсетіледі", "link": "🌐 Сілтеме үшін {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 Файл {class_name}\n\n🌘 {prefix}lm осы хабарламаны жауап болар енгізу үшін\n\n{not_exact}", "args": " Аргументтерді көрсетуіңіз керек", "_cmd_doc_ml": "<модуль атауы> - Модульге сілтеме жіберу" } strings_it = { "404": " Modulo non trovato", "not_exact": "⚠️ Nessuna corrispondenza esatta trovata, quindi viene visualizzato il risultato più vicino", "link": "🌐 Collegamento per {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 File {class_name}\n\n🌘 {prefix}lm questo messaggio come risposta per installarlo\n\n{not_exact}", "args": " È necessario specificare gli argomenti", "_cmd_doc_ml": " - Invia il link al modulo" } strings_fr = { "404": " Module introuvable", "not_exact": "⚠️ Aucune correspondance exacte n'a été trouvée, le résultat le plus proche est donc affiché", "link": "🌐 Lien vers {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 Fichier {class_name}\n\n🌘 {prefix}lm en réponse à ce message pour l'installer\n\n{not_exact}", "args": " Vous devez spécifier des arguments", "_cmd_doc_ml": " - Envoyer le lien vers le module" } strings_es = { "404": " Módulo no encontrado", "not_exact": "⚠️ No se ha encontrado una coincidencia exacta, por lo que se muestra el resultado más cercano", "link": "🌐 Enlace de {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 Archivo de {class_name}\n\n🌘 {prefix}lm en respuesta a este mensaje para instalar\n\n{not_exact}", "args": " Debes especificar argumentos", "_cmd_doc_ml": " - Enviar enlace al módulo" } strings_de = { "404": " Modul nicht gefunden", "not_exact": "⚠️ Es wurde keine exakte Übereinstimmung gefunden, daher wird stattdessen das nächstgelegene Ergebnis angezeigt", "link": "🌐 Link zu {class_name}\n\n🌘 {prefix}dlm {url}\n\n{not_exact}", "file": "📁 Datei {class_name}\n\n🌘 {prefix}lm in Antwort auf diese Nachricht, um sie zu installieren\n\n{not_exact}", "args": " Du musst Argumente angeben", "_cmd_doc_ml": " - Send link to module" } @loader.command() async def nmlcmd(self, message: Message): """send module via file""" if not (args := utils.get_args_raw(message)): await utils.answer(message, self.strings("args")) return exact = True if not ( class_name := next( ( module.strings("name") for module in self.allmodules.modules if args.lower() in { module.strings("name").lower(), module.__class__.__name__.lower(), } ), None, ) ): if not ( class_name := next( reversed( sorted( [ module.strings["name"].lower() for module in self.allmodules.modules ] + [ module.__class__.__name__.lower() for module in self.allmodules.modules ], key=lambda x: difflib.SequenceMatcher( None, args.lower(), x, ).ratio(), ) ), None, ) ): await utils.answer(message, self.strings("404")) return exact = False try: module = self.lookup(class_name) sys_module = inspect.getmodule(module) except Exception: await utils.answer(message, self.strings("404")) return link = module.__origin__ text = ( f"🧳 {utils.escape_html(class_name)}" if not utils.check_url(link) else ( f'📼 Link for' f" {utils.escape_html(class_name)}:" f' {link}\n\n{self.strings("not_exact") if not exact else ""}' ) ) text = ( self.strings("link").format( class_name=utils.escape_html(class_name), url=link, not_exact=self.strings("not_exact") if not exact else "", prefix=utils.escape_html(self.get_prefix()), ) if utils.check_url(link) else self.strings("file").format( class_name=utils.escape_html(class_name), not_exact=self.strings("not_exact") if not exact else "", prefix=utils.escape_html(self.get_prefix()), ) ) file = io.BytesIO(sys_module.__loader__.data) file.name = f"{class_name}.py" file.seek(0) await utils.answer_file( message, file, caption=text, ) def _format_result( self, result: dict, query: str, no_translate: bool = False, ) -> str: commands = "\n".join( [ f"▫️ {utils.escape_html(self.get_prefix())}{utils.escape_html(cmd)}:" f" {utils.escape_html(cmd_doc)}" for cmd, cmd_doc in result["module"]["commands"].items() ] ) kwargs = { "name": utils.escape_html(result["module"]["name"]), "dev": utils.escape_html(result["module"]["dev"]), "commands": commands, "cls_doc": utils.escape_html(result["module"]["cls_doc"]), "mhash": result["module"]["hash"], "query": utils.escape_html(query), "prefix": utils.escape_html(self.get_prefix()), } strings = ( self.strings.get("result", "en") if self.config["translate"] and not no_translate else self.strings("result") ) text = strings.format(**kwargs) if len(text) > 2048: kwargs["commands"] = "..." text = strings.format(**kwargs) return text