# ©️ 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