diff --git a/archquise/q.mods/UniversalDownloader.py b/archquise/q.mods/UniversalDownloader.py new file mode 100644 index 0000000..2d545b9 --- /dev/null +++ b/archquise/q.mods/UniversalDownloader.py @@ -0,0 +1,222 @@ +# █▀▀▄ █▀▄▀█ █▀█ █▀▄ █▀ +# ▀▀▀█ ▄ █ ▀ █ █▄█ █▄▀ ▄█ + +# #### Copyright (c) 2026 Archquise ##### + +# 💬 Contact: https://t.me/archquise +# 🔒 Licensed under the GNU AGPLv3. +# 📄 LICENSE: https://raw.githubusercontent.com/archquise/Q.Mods/main/LICENSE +# --------------------------------------------------------------------------------- +# Name: UniversalDownloader # noqa: ERA001 +# Description: Downloads media from YouTube, VK, TikTok, and all yt-dlp supported sites +# Author: @quise_m +# --------------------------------------------------------------------------------- +# meta developer: @quise_m +# meta banner: https://raw.githubusercontent.com/archquise/qmods_meta/main/UniversalDownloader.png +# requires: yt_dlp ffmpeg +# --------------------------------------------------------------------------------- + +import logging +import os +import platform +import re +import shutil +import zipfile +from http import HTTPStatus + +import aiofiles +import aiohttp +from yt_dlp import YoutubeDL + +from .. import loader, utils + +logger = logging.getLogger(__name__) + + +@loader.tds +class UniversalDownloaderMod(loader.Module): + """Downloads media from YouTube, VK, TikTok, and all yt-dlp supported sites""" # noqa: D400, D415 + + strings = { # noqa: RUF012 + "name": "UniversalDownloader", + "_cls_doc": "Downloads media from YouTube, VK, TikTok, and all yt-dlp supported sites", # noqa: E501 + "select_download_type": "⬇️ Select download type:", # noqa: E501 + "invalid_args": " There is no arguments or they are invalid", # noqa: E501 + "downloading": "🕐 Downloading...", # noqa: E501 + "cookie_desc": "Cookie account (helps downloading video with strict age rating restricrions)", # noqa: E501 + "deno_err": '❗️ Error! The Deno JavaScript engine was not install automatically.\nThis is a required dependency for yt-dlp (a library for downloading video/audio) to work correctly.\n\nTo continue, you need to install the engine manually, or resolve any issues preventing automatic installation and restart the userbot.', # noqa: E501 + "err": "❗️ Error!\n\nAdditional info: {}", # noqa: E501 + "video": "video", + "audio": "audio", + } + + strings_ru = { # noqa: RUF012 + "_cls_doc": "Скачивает медиа из YouTube, VK, TikTok и всех поддерживаемых yt-dlp сайтов", # noqa: E501 + "select_download_type": "⬇️ Выберите тип загрузки:", # noqa: E501 + "invalid_args": " Нет аргументов или они неверны", # noqa: E501 + "downloading": "🕐 Скачиваю...", + "cookie_desc": "Куки аккаунта (помогает скачивать видео с жесткими возрастными ограничениями)", # noqa: E501, RUF001 + "deno_err": '❗️ Ошибка! JS-движок Deno не установился автоматически.\nЭто необходимая зависимость для корректной работы yt-dlp (библиотека для скачивания видео/аудио).\n\nДля продолжения вам необходимо установить движок вручную, или устранить препятствия для автоматической установки и перезагрузить юзербота.', # noqa: E501 + "err": "❗️ Ошибка!\n\nДоп.информация: {}", # noqa: E501, RUF001 + "video": "видео", + "audio": "аудио", + } + + deno_error = ( + "Deno wasn't installed in auto-mode.", + "Please, install it manually or resolve the issue and reboot userbot.", + ) + + def _validate_url(self, url: str) -> bool: + """Validate URL format.""" + if not url: + return False + + url_pattern = re.compile( + r"https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)", + re.IGNORECASE, + ) + + return url_pattern.match(url) is not None + + async def get_target(self) -> str: + """Check OS and processor architecture and return right postfix.""" + system = platform.system() + machine = platform.machine().lower() + + if system == "Windows": + return "Windows" + + if system == "Darwin": + return ( + "aarch64-apple-darwin" if machine == "arm64" else "x86_64-apple-darwin" + ) + + if system == "Linux": + return ( + "aarch64-unknown-linux-gnu" + if machine in ("aarch64", "arm64") + else "x86_64-unknown-linux-gnu" + ) + + return "x86_64-unknown-linux-gnu" + + def _get_deno(self) -> str | None: + if not (source := self.get("deno_source")) or source == "install_failed" or not os.path.exists(source): + logger.critical("%s %s", *self.deno_error) + return None + return source + + + def __init__(self): # noqa: ANN204, D107 + self.config = loader.ModuleConfig( + loader.ConfigValue( + "youtube_cookie", + None, + lambda: self.strings["cookie_desc"], + validator=loader.validators.Hidden(), + ), + ) + + async def client_ready(self, client, db): # noqa: ANN001, ANN201, D102, ARG002 + + deno_which = shutil.which("deno", path=os.environ.get("PATH", "") + os.pathsep + os.getcwd()) # noqa: E501 + + if deno_which: + self.set("deno_source", deno_which) + return + + logger.warning("Deno is not installed, attempting installation...") + target = await self.get_target() + if target == "Windows": + logger.critical( + "Windows platform is unsupported, please, unload the module.", + ) + return + async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(60)) as session: + download_link = f"https://github.com/denoland/deno/releases/latest/download/deno-{target}.zip" + async with session.get(download_link) as resp: + if resp.status == HTTPStatus.OK: + async with aiofiles.open("deno.zip", mode="wb") as f: + async for chunk in resp.content.iter_chunked(8192): + await f.write(chunk) + else: + logger.critical("Failed to download Deno: HTTP %s", resp.status) + self.set("deno_source", "install_failed") + return + if os.path.exists('deno.zip'): + with zipfile.ZipFile("deno.zip", "r") as zip_ref: + zip_ref.extractall() + os.remove('deno.zip') + os.chmod(path=os.path.join(os.getcwd(), "deno"), mode=0o755) + self.set("deno_source", os.path.join(os.getcwd(), "deno")) + return + + @loader.command(en_doc="Download media", ru_doc="Скачать медиа") + async def unidlcmd(self, message) -> None: # noqa: ANN001, D102 + args = utils.get_args(message) + if not args or not self._validate_url(args[0]) or len(args) > 1: + await utils.answer(message, self.strings["invalid_args"]) + return + + async def _download_media(call, download_type: str) -> None: + + if not (source := self._get_deno()): + await call.edit(self.strings["deno_err"]) + return + + await call.answer() + await call.delete() + + downloading_msg = await self._client.send_message(message.chat_id, self.strings["downloading"], reply_to=message.reply_to_msg_id) # noqa: E501 + + ydl_opts = { + "quiet": True, + "js_runtimes": {"deno": {"path": source}}, + } + + if cookie := self.get("youtube_cookie"): + ydl_opts["cookiefile"] = cookie + + if download_type == "audio": + ydl_opts["outtmpl"] = f"audio_{message.id}.%(ext)s" + ydl_opts["format"] = "bestaudio/best" + ydl_opts["postprocessors"] = [ + { + "key": "FFmpegExtractAudio", + "preferredcodec": "mp3", + "preferredquality": "0", + }, + { + "key": "FFmpegMetadata", + "add_metadata": True, + }, + { + "key": "EmbedThumbnail", + }, + ] + ydl_opts["writethumbnail"] = True + + if download_type == "video": + ydl_opts["outtmpl"] = f"video_{message.id}.%(ext)s" + ydl_opts["format"] = "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" # noqa: E501 + ydl_opts["merge_output_format"] = "mp4" + + try: + with YoutubeDL(ydl_opts) as ydl: + info = await utils.run_sync(lambda: ydl.extract_info(args[0], download=True)) # noqa: E501 + filename = ydl.prepare_filename(info).split(".")[0] + (".mp3" if download_type == "audio" else ".mp4") # noqa: E501 + await self._client.send_file(message.chat_id, filename, reply_to=message.reply_to_msg_id) # noqa: E501 + await downloading_msg.delete() + except Exception as e: + logger.exception("Catched error during download!") + await call.answer() + await downloading_msg.edit(self.strings["err"].format(e)) + finally: + if os.path.exists(filename): + os.remove(filename) + + + call = await self.inline.form("🪐", message) + await message.delete() + await call.edit(self.strings["select_download_type"], reply_markup=[[{"text": self.strings["video"], "callback": _download_media, "args": ("video",)}, {"text": self.strings["audio"], "callback": _download_media, "args": ("audio",)}]]) # noqa: E501 diff --git a/modules.json b/modules.json index 67d9b33..efd65a8 100644 --- a/modules.json +++ b/modules.json @@ -8443,34 +8443,6 @@ "has_on_unload": true, "class_cmd_names": {} }, - "Fixyres/FModules/LFSecurity.py": { - "name": "FSecurity", - "description": "Module for automatic AI-based security checks of installed modules.", - "cls_doc": { - "ru": "Модуль для автоматической проверки устанавливаемых модулей через ИИ.", - "ua": "Модуль для автоматичної перевірки встановлюваних модулів через ШІ.", - "de": "Modul zur automatischen Prüfung installierter Module mit KI.", - "jp": "AIでインストールされるモジュールを自動チェックするモジュール。", - "tr": "Kurulan modülleri yapay zeka ile otomatik kontrol eden modül.", - "uz": "O'rnatilayotgan modullarni AI orqali avtomatik tekshiruvchi modul.", - "kz": "Орнатылатын модульдерді ЖИ арқылы автоматты тексеретін модуль." - }, - "meta": { - "pic": null, - "banner": "https://raw.githubusercontent.com/Fixyres/FModules/refs/heads/main/assets/FSecurity/banner.png", - "developer": "@NFModules", - "fhsdesc": "security, guard, antiscam, antivirus" - }, - "commands": [], - "new_commands": [], - "inline_handlers": [], - "strings": { - "name": "FSecurity" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, "Fixyres/FModules/FSecurity.py": { "name": "FSecurity", "description": "Module for automatic AI-based security checks of installed modules.", @@ -12852,6 +12824,65 @@ "has_on_unload": false, "class_cmd_names": {} }, + "archquise/q.mods/UniversalDownloader.py": { + "name": "UniversalDownloaderMod", + "description": "Downloads media from YouTube, VK, TikTok, and all yt-dlp supported sites", + "cls_doc": { + "default": "Downloads media from YouTube, VK, TikTok, and all yt-dlp supported sites", + "ru": "Скачивает медиа из YouTube, VK, TikTok и всех поддерживаемых yt-dlp сайтов" + }, + "meta": { + "pic": null, + "banner": "https://raw.githubusercontent.com/archquise/qmods_meta/main/UniversalDownloader.png", + "developer": "@quise_m" + }, + "commands": [ + { + "unidl": "(EN) Download media | (RU) Скачать медиа" + } + ], + "new_commands": [ + { + "name": "unidl", + "original_name": "unidlcmd", + "description": { + "default": "", + "en": "Download media", + "ru": "Скачать медиа" + }, + "cmd_names": {}, + "aliases": [], + "usage": null, + "inline": false, + "is_inline_handler": false, + "decorators": [] + } + ], + "inline_handlers": [], + "strings": { + "name": "UniversalDownloader", + "_cls_doc": "Downloads media from YouTube, VK, TikTok, and all yt-dlp supported sites", + "select_download_type": "⬇️ Select download type:", + "invalid_args": " There is no arguments or they are invalid", + "downloading": "🕐 Downloading...", + "cookie_desc": "Cookie account (helps downloading video with strict age rating restricrions)", + "deno_err": "❗️ Error! The Deno JavaScript engine was not install automatically.\nThis is a required dependency for yt-dlp (a library for downloading video/audio) to work correctly.\n\nTo continue, you need to install the engine manually, or resolve any issues preventing automatic installation and restart the userbot.", + "err": "❗️ Error!\n\nAdditional info: {}", + "video": "video", + "audio": "audio", + "select_download_type_ru": "⬇️ Выберите тип загрузки:", + "invalid_args_ru": " Нет аргументов или они неверны", + "downloading_ru": "🕐 Скачиваю...", + "cookie_desc_ru": "Куки аккаунта (помогает скачивать видео с жесткими возрастными ограничениями)", + "deno_err_ru": "❗️ Ошибка! JS-движок Deno не установился автоматически.\nЭто необходимая зависимость для корректной работы yt-dlp (библиотека для скачивания видео/аудио).\n\nДля продолжения вам необходимо установить движок вручную, или устранить препятствия для автоматической установки и перезагрузить юзербота.", + "err_ru": "❗️ Ошибка!\n\nДоп.информация: {}", + "video_ru": "видео", + "audio_ru": "аудио" + }, + "has_on_load": false, + "has_on_unload": false, + "class_cmd_names": {} + }, "archquise/q.mods/AniLiberty.py": { "name": "AniLibertyMod", "description": "Ищет и возвращает случайное аниме из базы Aniliberty.", @@ -13227,5859 +13258,6 @@ "has_on_unload": false, "class_cmd_names": {} }, - "archquise/H.Modules/numbersapi.py": { - "name": "NumbersAPI", - "description": "Many interesting facts about numbers.", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "num": "Get interesting fact about number or date | (RU) Дает интересный факт про число или дату\nНапример: .num 10 math или .num 01.01 date | (EN) Gives an interesting fact about a number or date\nexample: .num 10 math or .num 01.01 date" - } - ], - "new_commands": [ - { - "name": "num", - "original_name": "num", - "description": { - "default": "Get interesting fact about number or date", - "ru": "Дает интересный факт про число или дату\nНапример: .num 10 math или .num 01.01 date", - "en": "Gives an interesting fact about a number or date\nexample: .num 10 math or .num 01.01 date" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "NumbersAPI", - "usage": " Usage: .num \nExamples: .num 42 math, .num 01.15 date", - "error_date_format": " Invalid date format. Use: month.day (e.g., 01.15)", - "error_number_format": " Invalid number format.", - "error_invalid_type": " Invalid fact type. Available: math, trivia, date", - "error_api": " Failed to get fact. Please try again later.", - "fetching": "🌎 Fetching fact...", - "usage_ru": " Использование: .num <число или дата> <тип>\nПримеры: .num 42 math, .num 01.15 date", - "error_date_format_ru": " Неверный формат даты. Используйте: месяц.день (например, 01.15)", - "error_number_format_ru": " Неверный формат числа.", - "error_invalid_type_ru": " Неверный тип факта. Доступны: math, trivia, date", - "error_api_ru": " Не удалось получить факт. Попробуйте позже.", - "fetching_ru": "🌎 Получение факта..." - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/FakeActions.py": { - "name": "FakeActionsMod", - "description": "Module for simulating various actions in chat", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "ft": " - Simulates typing in chat for the specified number of seconds." - }, - { - "ff": " - Simulates sending a file." - }, - { - "fg": " - Simulates recording a voice message." - }, - { - "fvg": " - Simulates recording a video message." - }, - { - "fpg": " - Simulates playing a game." - } - ], - "new_commands": [ - { - "name": "ft", - "original_name": "ftcmd", - "description": { - "default": " - Simulates typing in chat for the specified number of seconds." - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "ff", - "original_name": "ffcmd", - "description": { - "default": " - Simulates sending a file." - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "fg", - "original_name": "fgcmd", - "description": { - "default": " - Simulates recording a voice message." - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "fvg", - "original_name": "fvgcmd", - "description": { - "default": " - Simulates recording a video message." - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "fpg", - "original_name": "fpgcmd", - "description": { - "default": " - Simulates playing a game." - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "FakeActions" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/ReplaceVowels.py": { - "name": "VowelReplacer", - "description": "Replaces vowel letters with ё", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "vowelreplace": "(RU) Включить или отключить замену гласных на ё. | (EN) Enable or disable vowel substitution for ё." - } - ], - "new_commands": [ - { - "name": "vowelreplace", - "original_name": "vowelreplace", - "description": { - "default": "", - "ru": "Включить или отключить замену гласных на ё.", - "en": "Enable or disable vowel substitution for ё." - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "Vowel Replacer", - "on": "✅ Vowel substitution for ё has been successfully enabled.", - "off": "🚫 Vowel substitution for ё is disabled.", - "on_ru": "✅ Замена гласных на ё успешно включена.", - "off_ru": "🚫 Замена гласных на ё отключена." - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/EmojiStickerBlocker.py": { - "name": "EmojiStickerBlocker", - "description": "Block emojis, stickers and sticker packs with enhanced functionality", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "packblock": "Block emoji pack/sticker pack | (RU) [link/название пака] — блокирует эмодзипак/стикерпак в личных сообщениях | (EN) [link/pack name] — block emoji pack/sticker pack in private messages" - }, - { - "stickblock": "Block sticker from reply | (RU) [reply] — блокирует определенный стикер | (EN) [reply] — block specific sticker" - }, - { - "emojiblock": "Block emoji from reply or input | (RU) [reply/enter] — блокирует определенное эмодзи | (EN) [reply/enter] — block specific emoji" - }, - { - "ublpack": "Unblock emoji pack/sticker pack | (RU) — снимает блокировку с эмодзипака/стикерпака | (EN) — unblock emoji pack/sticker pack" - }, - { - "ublthis": "Unblock emoji/sticker from reply or input | (RU) [reply/enter] — снимает блокировку с определенного эмодзи/стикера | (EN) [reply/enter] — unblock specific emoji/sticker" - }, - { - "blocklist": "Show blocklist | (RU) — показать список заблокированных паков/стикеров/эмодзи | (EN) — show list of blocked packs/stickers/emojis" - }, - { - "clearblocks": "Clear all blocks | (RU) — очистить все блокировки | (EN) — clear all blocks" - } - ], - "new_commands": [ - { - "name": "packblock", - "original_name": "packblock", - "description": { - "default": "Block emoji pack/sticker pack", - "ru": "[link/название пака] — блокирует эмодзипак/стикерпак в личных сообщениях", - "en": "[link/pack name] — block emoji pack/sticker pack in private messages" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "stickblock", - "original_name": "stickblock", - "description": { - "default": "Block sticker from reply", - "ru": "[reply] — блокирует определенный стикер", - "en": "[reply] — block specific sticker" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "emojiblock", - "original_name": "emojiblock", - "description": { - "default": "Block emoji from reply or input", - "ru": "[reply/enter] — блокирует определенное эмодзи", - "en": "[reply/enter] — block specific emoji" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "ublpack", - "original_name": "ublpack", - "description": { - "default": "Unblock emoji pack/sticker pack", - "ru": "— снимает блокировку с эмодзипака/стикерпака", - "en": "— unblock emoji pack/sticker pack" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "ublthis", - "original_name": "ublthis", - "description": { - "default": "Unblock emoji/sticker from reply or input", - "ru": "[reply/enter] — снимает блокировку с определенного эмодзи/стикера", - "en": "[reply/enter] — unblock specific emoji/sticker" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "blocklist", - "original_name": "blocklist", - "description": { - "default": "Show blocklist", - "ru": "— показать список заблокированных паков/стикеров/эмодзи", - "en": "— show list of blocked packs/stickers/emojis" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "clearblocks", - "original_name": "clearblocks", - "description": { - "default": "Clear all blocks", - "ru": "— очистить все блокировки", - "en": "— clear all blocks" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "EmojiStickerBlocker", - "no_permission": " Need delete messages permission", - "pack_blocked": " Pack blocked", - "pack_not_found": " Pack not found", - "sticker_blocked": " Sticker blocked", - "emoji_blocked": " Emoji blocked", - "pack_unblocked": " Pack unblocked", - "item_unblocked": " Item unblocked", - "not_found": " Not in blocklist", - "no_reply": " Reply to a sticker or emoji", - "no_args": " Specify pack link or name", - "list_packs": "📦 Blocked packs: {}", - "list_stickers": "🖼 Blocked stickers: {}", - "list_emojis": "😀 Blocked emojis: {}", - "all_cleared": "✅ All blocks cleared", - "no_permission_ru": " Нужны права на удаление сообщений", - "pack_blocked_ru": " Пак заблокирован", - "pack_not_found_ru": " Пак не найден", - "sticker_blocked_ru": " Стикер заблокирован", - "emoji_blocked_ru": " Эмодзи заблокирован", - "pack_unblocked_ru": " Пак разблокирован", - "item_unblocked_ru": " Элемент разблокирован", - "not_found_ru": " Не найден в блоклисте", - "no_reply_ru": " Ответьте на стикер или эмодзи", - "no_args_ru": " Укажите ссылку или название пака", - "list_packs_ru": "📦 Заблокированные паки: {}", - "list_stickers_ru": "🖼 Заблокированные стикеры: {}", - "list_emojis_ru": "😀 Заблокированные эмодзи: {}", - "all_cleared_ru": "✅ Все блоки очищены" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/InfoBannersManager.py": { - "name": "InfoBannersManagerMod", - "description": "Автоматически меняет баннеры на случайные из выбранного списка через заданный промежуток времени", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [], - "new_commands": [], - "inline_handlers": [], - "strings": { - "name": "InfoBannersManager" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/InlineHelper.py": { - "name": "InlineHelperMod", - "description": "Basic management of the UB in case only the inline works", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "restartinlinehandler": "" - }, - { - "updateinlinehandler": "" - }, - { - "terminalinlinehandler": "Execute terminal command safely" - }, - { - "modulesinlinehandler": "List all installed modules" - }, - { - "resetprefixinlinehandler": "" - } - ], - "new_commands": [ - { - "name": "restartinlinehandler", - "original_name": "restart_inline_handler", - "description": { - "default": "" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": true, - "is_inline_handler": true, - "decorators": [] - }, - { - "name": "updateinlinehandler", - "original_name": "update_inline_handler", - "description": { - "default": "" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": true, - "is_inline_handler": true, - "decorators": [] - }, - { - "name": "terminalinlinehandler", - "original_name": "terminal_inline_handler", - "description": { - "default": "Execute terminal command safely" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": true, - "is_inline_handler": true, - "decorators": [] - }, - { - "name": "modulesinlinehandler", - "original_name": "modules_inline_handler", - "description": { - "default": "List all installed modules" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": true, - "is_inline_handler": true, - "decorators": [] - }, - { - "name": "resetprefixinlinehandler", - "original_name": "resetprefix_inline_handler", - "description": { - "default": "" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": true, - "is_inline_handler": true, - "decorators": [] - } - ], - "inline_handlers": [ - { - "name": "restartinlinehandler", - "description": { - "default": "" - }, - "decorators": [] - }, - { - "name": "updateinlinehandler", - "description": { - "default": "" - }, - "decorators": [] - }, - { - "name": "terminalinlinehandler", - "description": { - "default": "Execute terminal command safely" - }, - "decorators": [] - }, - { - "name": "modulesinlinehandler", - "description": { - "default": "List all installed modules" - }, - "decorators": [] - }, - { - "name": "resetprefixinlinehandler", - "description": { - "default": "" - }, - "decorators": [] - } - ], - "strings": { - "name": "InlineHelper", - "call_restart": "🔄 Restarting...", - "call_update": "🔄 Updating...", - "res_prefix": " Prefix successfully reset to default", - "restart_inline_handler_title": "🔄 Restart Userbot", - "restart_inline_handler_description": "Restart your userbot via inline", - "restart_inline_handler_message": "🔄 Restart", - "update_inline_handler_title": "🔄 Update Userbot", - "update_inline_handler_description": "Update your userbot via inline", - "update_inline_handler_message": "🔄 Update", - "terminal_inline_handler_title": "💻 Command Executed", - "terminal_inline_handler_description": "Command executed successfully", - "terminal_inline_handler_message": "Command {text} executed successfully in terminal", - "modules_inline_handler_title": "📦 Modules", - "modules_inline_handler_description": "List all installed modules", - "modules_inline_handler_result": "📦 All installed modules:\n\n", - "resetprefix_inline_handler_title": "⚠️ Reset Prefix", - "resetprefix_inline_handler_description": "Reset your prefix back to default (be careful!)", - "resetprefix_inline_handler_message": "Are you sure you want to reset your prefix to default dot?", - "resetprefix_inline_handler_reply_text_yes": "Yes, reset it", - "resetprefix_inline_handler_reply_text_no": "No, cancel", - "error_no_module": " Module not found: {module}", - "error_command_failed": " Command execution failed: {error}", - "error_git_failed": " Git operation failed: {error}", - "call_restart_ru": "🔄 Перезагружаю...", - "call_update_ru": "🔄 Обновляю...", - "res_prefix_ru": " Префикс успешно сброшен по умолчанию", - "restart_inline_handler_title_ru": "🔄 Перезагрузить юзербота", - "restart_inline_handler_description_ru": "Перезагрузить юзербота через инлайн", - "restart_inline_handler_message_ru": "🔄 Перезагрузка", - "update_inline_handler_title_ru": "🔄 Обновить юзербота", - "update_inline_handler_description_ru": "Обновить юзербота через инлайн", - "update_inline_handler_message_ru": "🔄 Обновить", - "terminal_inline_handler_title_ru": "💻 Команда выполнена!", - "terminal_inline_handler_description_ru": "Команда успешно выполнена.", - "terminal_inline_handler_message_ru": "Команда {text} была успешно выполнена в терминале", - "modules_inline_handler_title_ru": "📦 Модули", - "modules_inline_handler_description_ru": "Вывести список установленных модулей", - "modules_inline_handler_result_ru": "📦 Все установленные модули:\n\n", - "resetprefix_inline_handler_title_ru": "⚠️ Сбросить префикс", - "resetprefix_inline_handler_description_ru": "Сбросить префикс по умолчанию (осторожно!)", - "resetprefix_inline_handler_message_ru": "Вы действительно хотите сбросить ваш префикс и установить стандартную точку?", - "resetprefix_inline_handler_reply_text_yes_ru": "Да, сбросить", - "resetprefix_inline_handler_reply_text_no_ru": "Нет, отменить", - "error_no_module_ru": " Модуль не найден: {module}", - "error_command_failed_ru": " Ошибка выполнения команды: {error}", - "error_git_failed_ru": " Ошибка git операции: {error}" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/AccountData.py": { - "name": "AccountData", - "description": "Find out the approximate date of registration of the telegram account", - "cls_doc": { - "default": "Find out the approximate date of registration of the telegram account", - "ru": "Узнайте примерную дату регистрации Telegram-аккаунта" - }, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "accdata": "(RU) Узнать примерную дату регистрации Telergam-аккаунта | (EN) Find out the approximate date of registration of the telegram account" - } - ], - "new_commands": [ - { - "name": "accdata", - "original_name": "accdata", - "description": { - "default": "", - "ru": "Узнать примерную дату регистрации Telergam-аккаунта", - "en": "Find out the approximate date of registration of the telegram account" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "AccountData", - "_cls_doc": "Find out the approximate date of registration of the telegram account", - "date_text": "⏰️ Date of registration of this account: {data} (Accuracy: {accuracy}%)", - "date_text_ps": " Tip: To increase accuracy, the person whose registration date is being checked can write any message to @mewpl2.\n\nDon't worry, this account is not run by a person, but by a userbot just like yours, which will check the registration date using Telegram's built-in tool.", - "no_reply": "💬 You did not reply to the user's message", - "date_text_ru": "⏰️ Дата регистрации этого аккаунта: {data} (Точность: {accuracy}%)", - "date_text_ps_ru": " Совет: Для повышения точности, человек, дата регистрации которого проверяется, может написать любое сообщение @mewpl2.\n\nНе бойтесь, на этом аккаунте сидит не человек, а такой же юзербот, как и у вас, который проверит дату регистрации при помощи встроенного инструмента Telegram.", - "no_reply_ru": "💬 Вы не ответили на сообщение пользователя" - }, - "has_on_load": false, - "has_on_unload": true, - "class_cmd_names": {} - }, - "archquise/H.Modules/animals.py": { - "name": "animals", - "description": "Random cats and dogs", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "fcat": "(RU) Файлы случайных фотографий кошек | (EN) Random photos of cats files" - }, - { - "fdog": "(RU) Случайные фотографии собачьих файлов | (EN) Random photos of dog files" - }, - { - "cat": "(RU) Случайные фотографии кошек | (EN) Random photos of cats" - }, - { - "dog": "(RU) Случайные фотографии собаки | (EN) Random photos of dog" - } - ], - "new_commands": [ - { - "name": "fcat", - "original_name": "fcatcmd", - "description": { - "default": "", - "ru": "Файлы случайных фотографий кошек", - "en": "Random photos of cats files" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "fdog", - "original_name": "fdogcmd", - "description": { - "default": "", - "ru": "Случайные фотографии собачьих файлов", - "en": "Random photos of dog files" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "cat", - "original_name": "catcmd", - "description": { - "default": "", - "ru": "Случайные фотографии кошек", - "en": "Random photos of cats" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "dog", - "original_name": "dogcmd", - "description": { - "default": "", - "ru": "Случайные фотографии собаки", - "en": "Random photos of dog" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "animals", - "loading": "Generation is underway 🕐", - "done": "Here is your salute ❤️", - "loading_ru": "Генерация идет полным ходом 🕐", - "done_ru": "Вот ваш результат ❤️" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/sdsaver.py": { - "name": "SDSaverMod", - "description": "The module for automatically saving self-destructing media", - "cls_doc": { - "ru": "Модуль для автоматического сохранения самоуничтожающихся медиа" - }, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "sdmode": "(RU) Включить/Выключить автоматическое сохранение самоуничтожающихся медиа | (EN) Enable/Disable automatic saving self-destructing media" - } - ], - "new_commands": [ - { - "name": "sdmode", - "original_name": "sdmodecmd", - "description": { - "default": "", - "ru": "Включить/Выключить автоматическое сохранение самоуничтожающихся медиа", - "en": "Enable/Disable automatic saving self-destructing media" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "SDSaver", - "sdmode_on": "🔥 Automatic saving self-destructing media is enabled", - "sdmode_off": "🔥 Automatic saving self-destructing media is disabled", - "sd": "🔥 {name} sent self-destructing media:\n{caption}", - "sdmode_on_ru": "🔥 Автоматическое сохранение самоуничтожающихся медиа включено", - "sdmode_off_ru": "🔥 Автоматическое сохранение самоуничтожающихся медиа выключено", - "sd_ru": "🔥 {name} отправил(а) самоуничтожающееся медиа:\n{caption}" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/caliases.py": { - "name": "CustomAliasesMod", - "description": "Module for custom aliases", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "caliases": "Get all aliases | (RU) Получить список всех алиасов | (EN) Get list of all aliases" - }, - { - "rmcalias": "Remove alias | (RU) <имя> Удалить алиас | (EN) Remove alias" - }, - { - "calias": "Add new alias (may contain {args} keyword) | (RU) <имя> <команда> [аргументы] Добавить новый алиас (может содержать ключевое слово {args}) | (EN) [arguments] Add new alias (may contain {args} keyword)" - } - ], - "new_commands": [ - { - "name": "caliases", - "original_name": "caliasescmd", - "description": { - "default": "Get all aliases", - "ru": "Получить список всех алиасов", - "en": " Get list of all aliases" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "rmcalias", - "original_name": "rmcaliascmd", - "description": { - "default": "Remove alias", - "ru": "<имя> Удалить алиас", - "en": " Remove alias" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - }, - { - "name": "calias", - "original_name": "caliascmd", - "description": { - "default": "Add new alias (may contain {args} keyword)", - "ru": "<имя> <команда> [аргументы] Добавить новый алиас (может содержать ключевое слово {args})", - "en": " [arguments] Add new alias (may contain {args} keyword)" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "CAliases", - "c404": " Command {} not found!", - "a404": " Custom alias {} not found!", - "no_args": " You must specify two args: alias name and command", - "added": " Custom alias {alias} for command {prefix}{cmd} successfully added!\nUse it like: {prefix}{alias}{args}", - "argsopt": " [args (optional)]", - "deleted": " Custom alias {} successfully deleted", - "list": "🔗 Custom aliases ({len}):\n", - "no_aliases": " You have no custom aliases!", - "c404_ru": " Команда {} не найдена!", - "a404_ru": " Кастомный алиас {} не найден!", - "no_args_ru": " Вы должны указать как минимум два аргумента: имя алиаса и команду", - "added_ru": " Успешно добавил алиас с названием {alias} для команды {prefix}{cmd}\nИспользуй его так: {prefix}{alias}{args}", - "argsopt_ru": " [аргументы (необязательно)]", - "deleted_ru": " Кастомный алиас {} успешно удалён", - "list_ru": "🔗 Кастомные алиасы (всего {len}):\n", - "no_aliases_ru": " У вас нет кастомных алиасов!" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/Article.py": { - "name": "ArticleMod", - "description": "Displays your article Criminal Code of the Russian Federation", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "arc": "(RU) Отображается ваша статья Уголовного кодекса Российской Федерации | (EN) Displays your article Criminal Code of the Russian Federation" - } - ], - "new_commands": [ - { - "name": "arc", - "original_name": "arccmd", - "description": { - "default": "", - "ru": "Отображается ваша статья Уголовного кодекса Российской Федерации", - "en": "Displays your article Criminal Code of the Russian Federation" - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "Article", - "article": "📖 Your article of the Criminal Code of the Russian Federation:\n\n
Number {}\n\n{}
", - "article_ru": "📖 Твоя статья УК РФ:\n\n
Номер {}\n\n{}
" - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/SMArchiver.py": { - "name": "SMArchiver", - "description": "unloads all messages from Favorites", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "smdump": "(RU) выгружает все сообщения из Избранного / Saved Messages и собирает их в одном архиве. | (EN) downloads all messages from Favorites / Saved Messages and collects them in one archive." - } - ], - "new_commands": [ - { - "name": "smdump", - "original_name": "smdump", - "description": { - "default": "", - "ru": "выгружает все сообщения из Избранного / Saved Messages и собирает их в одном архиве.", - "en": "downloads all messages from Favorites / Saved Messages and collects them in one archive." - }, - "cmd_names": {}, - "aliases": [], - "usage": null, - "inline": false, - "is_inline_handler": false, - "decorators": [] - } - ], - "inline_handlers": [], - "strings": { - "name": "SMArchiver", - "archive_created": "🎉 Archive with messages has been successfully created: {filename}", - "no_messages": "⚠️ There are no messages in Saved Messages.", - "error": "❌ An error occurred: {error}", - "processing": "🛠️ Processing messages... Please wait.\n\nP.S: Be careful, if you have a lot of messages, you may get flooding, and if you have a lot of heavy files, the download will be slower than usual.", - "archive_created_ru": "🎉 Архив с сообщениями успешно создан: {filename}", - "no_messages_ru": "⚠️ В Сохраненных сообщениях нет сообщений.", - "error_ru": "❌ Произошла ошибка: {error}", - "processing_ru": "🛠️ Обработка сообщений... Пожалуйста, подождите.\n\nP.S: Будьте осторожны, если у вас много сообщений, вы можете получить флуд, а если у вас много тяжелых файлов, загрузка будет медленнее обычного." - }, - "has_on_load": false, - "has_on_unload": false, - "class_cmd_names": {} - }, - "archquise/H.Modules/mediatools.py": { - "name": "MediaToolsMod", - "description": "Powerful tools for working with media files", - "cls_doc": {}, - "meta": { - "pic": null, - "banner": null, - "developer": "@hikka_mods" - }, - "commands": [ - { - "convert": "(RU) <формат> - конвертировать медиа в указанный формат | (EN) - convert media to specified format" - }, - { - "voicedl": "(RU) Скачать голосовое сообщение как файл | (EN) Download voice message as file" - }, - { - "gif": "(RU) Преобразовать видео в GIF | (EN) Convert video to GIF" - }, - { - "cut": "(RU) <начало:конец> - обрезать медиа по времени | (EN) - trim media by time" - }, - { - "vircle": "(RU) [начало:конец] - Видео в кружок | (EN) [start:end] - Convert video to circle" - }, - { - "vsound": "(RU) [начало:конец] - Извлечь аудио из видео | (EN) [start:end] - Extract audio from video" - }, - { - "compress": "(RU) <качество> - Сжать видео | (EN) - Compress video" - }, - { - "split": "(RU) <время/размер> - Разделить медиа на части | (EN)