# `7MMM. ,MMF'`7MMM. ,MMF' `7MMM. ,MMF' `7MM # MMMb dPMM MMMb dPMM MMMb dPMM MM # M YM ,M MM M YM ,M MM M YM ,M MM ,pW"Wq. ,M""bMM ,pP"Ybd # M Mb M' MM M Mb M' MM M Mb M' MM 6W' `Wb ,AP MM 8I `" # M YM.P' MM M YM.P' MM mmmmm M YM.P' MM 8M M8 8MI MM `YMMMa. # M `YM' MM M `YM' MM M `YM' MM YA. ,A9 `Mb MM L. I8 # .JML. `' .JMML..JML. `' .JMML. .JML. `' .JMML.`Ybmd9' `Wbmd"MML.M9mmmP' # # (c) 2023 — licensed under Apache 2.0 — https://www.apache.org/licenses/LICENSE-2.0 # meta developer: @mm_mods # meta pic: https://img.icons8.com/emoji/256/locked-with-pen.png import os import requests import logging from telethon.tl.patched import Message from hikka import loader, utils logger = logging.getLogger(__name__) URL = 'https://versteck-1-j8565404.deta.app' # noinspection PyCallingNonCallable @loader.tds class VersteckMod(loader.Module): """Work with VersteckAPI — download modules if you are common user, grant permissions for downloading if you are developer!""" def __init__(self): self.config = loader.ModuleConfig( loader.ConfigValue( 'dev_name', '', lambda: 'Name of Versteck to use (if you are developer)', validator=loader.validators.String() ), loader.ConfigValue( 'dev_password', '', lambda: 'Password of Versteck to use (if you are developer)', validator=loader.validators.Hidden(loader.validators.Hidden()) ), ) strings = { 'name': 'Versteck', 'password?!': '🔴 Password is incorrect!', 'args?': '🔴 Not enough arguments!', 'name_already_exists': '🔴 Name already exists!', 'token_del_suc': '🟢 Token deleted successfully!', 'token_not_found': '🟡 Token not found!', 'versteck_not_found': '🟡 Versteck not found!', 'in-token_wrong': '🔴 In-token is incorrect!', 'connection_succesfull': '🔵 Connection succesfull!', 'permission_denied': '🟠 Permission denied!\nIt means that credentials were correct, but you don\'t ' 'have permissions to download this file.', 'file_not_found': '🟠 File not found!\nIt means that credentials were correct, but file was not found.', 'not_a_file': '🟠 Not a file!\nIt means that credentials were correct, but this is not a file.', 'rights_of_unauthorized_insuffucient': '🟠 Rights of unauthorized user are insufficient!\nIt means ' 'that Versteck exists, but you can\'t download this file without ' 'authorization.', 'no_unauthorized': '🔴 Unauthorized access for this Versteck is disabled!', 'out-token_invalid': '⚫ Out-token is invalid!\nIt means that credentials were correct, but out-token ' '(the token, that Versteck uses to download files) is invalid. Contact the developer ' 'of module you trying to download.', 'out-token_updated': '🟢 Out-token was updated successfully!', 'versteck_created': '🟢 Versteck was created successfully!\nPassword: {}\nName: {}\nUAP: {}', 'versteck_deleted': '🟢 Versteck was deleted successfully!', 'in-token_created': '🟢 In-token was created successfully!\nToken: {}\nRestrictions: {}', 'in-token_deleted': '🟢 In-token was deleted successfully!', 'module_result': '🟢 Module {} was {} successfully!', 'local_file_not_found': '🔴 This file isn\'t presenting in cache!', 'cache_cleared': '🟢 Cache was cleared successfully!', 'cache_contents': '💾 Cache contents:\n', 'cache_empty': '🟠 Cache is empty!', 'send_action:dwnld': 'downloaded', 'send_action:frmcch': 'extracted from cache', } strings_ru = { 'name': 'Versteck', 'password?!': '🔴 Пароль неверен!', 'args?': '🔴 Недостаточно аргументов!', 'name_already_exists': '🔴 Имя уже существует!', 'token_del_suc': '🟢 Токен успешно удалён!', 'token_not_found': '🔴 Токен не найден!', 'versteck_not_found': '🔴 Versteck-источник не найден!', 'in-token_wrong': '🔴 Входной токен неверен!', 'connection_succesfull': '🔵 Соединение успешно установлено!', 'permission_denied': '🟠 Доступ запрещён!\nЭто означает, что данные были верны, но у вас нет ' 'прав на скачивание этого файла.', 'file_not_found': '🟠 Файл не найден!\nЭто означает, что данные были верны, но файл не был найден.', 'not_a_file': '🟠 Это не файл!\nЭто означает, что данные были верны, но это не файл.', 'rights_of_unauthorized_insuffucient': '🟠 Права неавторизованного пользователя недостаточны!\nЭто ' 'означает, что Versteck-источник существует, но вы не можете скачать этот ' 'файл без авторизации.', 'no_unauthorized': '🔴 Неавторизованный доступ для этого Versteck-источника отключён!', 'out-token_invalid': '⚫ Внешний токен неверен!\nЭто означает, что данные были верны, но внешний токен ' '(токен, который использует Versteck для скачивания файлов) неверен. Свяжитесь с ' 'разработчиком модуля, который вы пытаетесь скачать.', 'out-token_updated': '🟢 Внешний токен был обновлён!', 'versteck_created': '🟢 Versteck-источник был создан!\nПароль: {}\nИмя: {}\nАПУ: {}', 'versteck_deleted': '🟢 Versteck-источник был удалён!', 'in-token_created': '🟢 Входной токен был создан!\nТокен: {}\nОграничения: {}', 'in-token_deleted': '🟢 Входной токен был удалён!', 'module_result': '🟢 Модуль {} был успешно {}!', 'local_file_not_found': '🔴 Этого файла нет в кэше!', 'cache_cleared': '🟢 Кэш был успешно очищен!', 'cache_contents': '💾 Содержимое кэша:\n', 'cache_empty': '🟠 Кэш пуст!', 'send_action:dwnld': 'скачан', 'send_action:frmcch': 'извлечён из кэша', '_cls_doc': 'Модуль для работы с VersteckAPI — скачивай модули, если ты обычный пользователь, давай разрешения ' 'на загрузку, если ты разработчик!', '_cmd_doc_newv': 'Создаёт новый Versteck-источник.', '_cmd_doc_delv': 'Удаляет Versteck-источник.', '_cmd_doc_newi': 'Создаёт новый входной токен.', '_cmd_doc_deli': 'Удаляет входной токен.', '_cmd_doc_testv': 'Проверяет соединение с Versteck.', '_cmd_doc_vml': 'Скачивает модуль из Versteck-источника.', '_cmd_doc_updateot': 'Обновляет внешний токен.', '_cmd_doc_vcacheclear': 'Очищает кэш.', '_cmd_doc_vcachefetch': 'Обыскивает кэш и, если передано имя файла, отправляет соответствующий файл.', } strings_de = { 'name': 'Versteck', 'password?!': '🔴 Passwort ist falsch!', 'args?': '🔴 Nicht genug Argumente!', 'name_already_exists': '🔴 Name existiert bereits!', 'token_del_suc': '🟢 Token erfolgreich gelöscht!', 'token_not_found': '🔴 Token nicht gefunden!', 'versteck_not_found': '🔴 Versteck nicht gefunden!', 'in-token_wrong': '🔴 In-Token ist falsch!', 'connection_succesfull': '🔵 Verbindung erfolgreich hergestellt!', 'permission_denied': '🟠 Zugriff verweigert!\nDas bedeutet, dass die Anmeldeinformationen korrekt waren, ' 'Sie jedoch keine Berechtigung zum Herunterladen dieser Datei haben.', 'file_not_found': '🟠 Datei nicht gefunden!\nDas bedeutet, dass die Anmeldeinformationen korrekt waren, ' 'die Datei jedoch nicht gefunden wurde.', 'not_a_file': '🟠 Keine Datei!\nDas bedeutet, dass die Anmeldeinformationen korrekt waren, dies jedoch ' 'keine Datei ist.', 'rights_of_unauthorized_insuffucient': '🟠 Die Rechte des nicht autorisierten Benutzers sind unzureichend!\n' 'Das bedeutet, dass der Versteck vorhanden ist, Sie jedoch ' 'diese Datei ohne Autorisierung nicht herunterladen können.', 'no_unauthorized': '🔴 Der nicht autorisierte Zugriff für diese Versteck ist deaktiviert!', 'out-token_invalid': '⚫ Aus-Token ist ungültig!\nDas bedeutet, dass die Anmeldeinformationen korrekt ' 'waren, aber der Aus-Token (der Token, den Versteck zum Herunterladen von Dateien ' 'verwendet) ist ungültig. Wenden Sie sich an den Entwickler des Moduls, das Sie ' 'herunterladen möchten.', 'out-token_updated': '🟢 Aus-Token wurde erfolgreich aktualisiert!', 'versteck_created': '🟢 Versteck erfolgreich erstellt!\nPasswort: {}\nName: {}\nNAP: {}', 'versteck_deleted': '🟢 Versteck erfolgreich gelöscht!', 'in-token_created': '🟢 In-Token erfolgreich erstellt!\nToken: {}\nEinschränkungen: {}', 'in-token_deleted': '🟢 In-Token erfolgreich gelöscht!', 'module_result': '🟢 Modul {} erfolgreich {}!', 'local_file_not_found': '🔴 Diese Datei ist nicht im Cache!', 'cache_cleared': '🟢 Cache erfolgreich gelöscht!', 'cache_contents': '💾 Cache-Inhalt:\n', 'cache_empty': '🟠 Der Cache ist leer!', 'send_action:dwnld': 'heruntergeladen', 'send_action:frmcch': 'aus dem Cache extrahiert', '_cls_doc': 'Modul für VersteckAPI — lade Module herunter, wenn du ein normaler Benutzer bist, gib ' 'Berechtigungen für Herunterladungen, wenn du ein Entwickler bist!', '_cmd_doc_newv': 'Erstellt einen neuen Versteck.', '_cmd_doc_delv': 'Löscht einen Versteck.', '_cmd_doc_newi': 'Erstellt einen neuen In-Token.', '_cmd_doc_deli': 'Löscht einen In-Token.', '_cmd_doc_testv': 'Überprüft die Verbindung mit Versteck.', '_cmd_doc_vml': 'Lädt ein Modul aus einem Versteck herunter.', '_cmd_doc_updateot': 'Aktualisiert den Aus-Token.', '_cmd_doc_vcacheclear': 'Leert den Cache.', '_cmd_doc_vcachefetch': 'Durchsucht den Cache und sendet, wenn ein Dateiname übergeben wird, die ' 'entsprechende Datei.', } async def newvcmd(self, m: Message): """Create new Versteck.""" args = utils.get_args_raw(m) if not args: return await utils.answer(m, self.strings('args?')) try: username, repo, token, name, unauthorized_rule = args.split() except ValueError: return await utils.answer(m, self.strings('args?')) data = { 'username': username, 'repo': repo, 'out_token': token, 'name': name, 'unauthorized_path': unauthorized_rule, } res = requests.post(f'{URL}/new/versteck', json=data).json() logging.error(f'{URL}/new/versteck') logging.error(res) if res['result'] == 'Name already exists': return await utils.answer(m, self.strings('name_already_exists')) return await utils.answer(m, self.strings('versteck_created').format(res['password'], name, unauthorized_rule)) async def delvcmd(self, m: Message): """Delete Versteck.""" password = self.config['dev_password'] name = self.config['dev_name'] if not password or not name: return await utils.answer(m, self.strings('args?')) res = requests.delete(f'{URL}/versteck/{name}', params={'password': password}).json() if res['result'] == 'Versteck not found': return await utils.answer(m, self.strings('versteck_not_found')) if res['result'] == 'Wrong password': return await utils.answer(m, self.strings('password?!')) return await utils.answer(m, self.strings('versteck_deleted')) async def newicmd(self, m: Message): """Create new in-token.""" args = utils.get_args_raw(m) if args: regex = args else: regex = '' password = self.config['dev_password'] name = self.config['dev_name'] if not password or not name: return await utils.answer(m, self.strings('args?')) data = { 'password': password, 'name': name, 'grant_to': regex } res = requests.post(f'{URL}/new/in-token', json=data).json() if res['result'] == 'Versteck not found': return await utils.answer(m, self.strings('versteck_not_found')) if res['result'] == 'Wrong password': return await utils.answer(m, self.strings('password?!')) return await utils.answer(m, self.strings('in-token_created').format(res['in_token'], regex or 0)) async def delicmd(self, m: Message): """Delete in-token.""" args = utils.get_args_raw(m) if not args: return await utils.answer(m, self.strings('args?')) token = args name = self.config['dev_name'] password = self.config['dev_password'] res = requests.delete(f'{URL}/in-token/{name}', params={'in_token': token, 'password': password}).json() if res['result'] == 'Versteck not found': return await utils.answer(m, self.strings('versteck_not_found')) if res['result'] == 'Wrong password': return await utils.answer(m, self.strings('password?!')) if res['result'] == 'Token not found': return await utils.answer(m, self.strings('token_not_found')) return await utils.answer(m, self.strings('in-token_deleted')) async def testvconncmd(self, m: Message): """Test Versteck connection.""" args = utils.get_args_raw(m) if not args: return await utils.answer(m, self.strings('args?')) try: name, in_token = args.split(':') except ValueError: return await utils.answer(m, self.strings('args?')) res = requests.get(f'{URL}/versteck/{name}/{in_token}/').json() if res['result'] == 'Versteck not found': return await utils.answer(m, self.strings('versteck_not_found')) elif res['result'] == 'Wrong in-token': return await utils.answer(m, self.strings('in-token_wrong')) elif res['result'] == 'Out-token is invalid': return await utils.answer(m, self.strings('out-token_invalid')) return await utils.answer(m, self.strings('connection_succesfull')) async def vmlcmd(self, m: Message): """Download module from Versteck.""" args = utils.get_args_raw(m) if not os.path.exists('versteck_downloads'): os.mkdir('versteck_downloads') if not args: return await utils.answer(m, self.strings('args?')) try: auth, path = args.split(' ') except ValueError: return await utils.answer(m, self.strings('args?')) try: name, in_token = auth.split(':') except ValueError: return await utils.answer(m, self.strings('args?')) data = { 'name': name, 'in_token': in_token, 'path': path } res = requests.post(f'{URL}/versteck/file/', json=data) try: res = res.json() except Exception as e: logging.error(res) if res['result'] == 'Versteck not found': return await utils.answer(m, self.strings('versteck_not_found')) elif res['result'] == 'Wrong in-token': return await utils.answer(m, self.strings('in-token_wrong')) elif res['result'] == 'File not found': return await utils.answer(m, self.strings('file_not_found')) elif res['result'] == 'Permission denied': return await utils.answer(m, self.strings('permission_denied')) elif res['result'] == 'Not a file': return await utils.answer(m, self.strings('not_a_file')) elif res['result'] == 'Out-token is invalid': return await utils.answer(m, self.strings('out-token_invalid')) elif res['result'] == 'Unauthorized access is not allowed': return await utils.answer(m, self.strings('no_unauthorized')) elif res['result'] == 'Unauthorized access is not allowed here': return await utils.answer(m, self.strings('rights_of_unauthorized_insuffucient')) with open(f"versteck_downloads/{path.split('/')[-1]}", 'w') as f: f.write(res['result']) await m.client.send_file( m.to_id, f"versteck_downloads/{path.split('/')[-1]}", caption=self.strings('module_result').format(path.split('/')[-1], self.strings('send_action:dwnld')) ) return await m.delete() async def updateotcmd(self, m: Message): """Update out-token.""" args = utils.get_args_raw(m) if not args: return await utils.answer(m, self.strings('args?')) out_token = args password = self.config['dev_password'] name = self.config['dev_name'] data = { 'new_token': out_token, } res = requests.post(f'{URL}/update/{name}', params={'password': password}, json=data).json() if res['result'] == 'Versteck not found': return await utils.answer(m, self.strings('versteck_not_found')) elif res['result'] == 'Wrong password': return await utils.answer(m, self.strings('password?!')) return await utils.answer(m, self.strings('out-token_updated')) async def vcachefetchcmd(self, m: Message): """Fetch local cache and return a file if found.""" args = utils.get_args_raw(m) if not args: to_send = self.strings('cache_contents') + '\n' # Check is there's any files in cache if not os.listdir('versteck_downloads'): return await utils.answer(m, self.strings('cache_empty')) for file in os.listdir('versteck_downloads'): to_send += f'≻ {file}\n' return await utils.answer(m, to_send) file = args try: with open(f'versteck_downloads/{file}', 'r') as _: pass except FileNotFoundError: return await utils.answer(m, self.strings('local_file_not_found')) await m.client.send_file( m.to_id, f"versteck_downloads/{file}", caption=self.strings('module_result').format(file, self.strings('send_action:frmcch')) ) return await m.delete() async def vcacheclearcmd(self, m: Message): """Clear local cache.""" for file in os.listdir('versteck_downloads'): os.remove(f'versteck_downloads/{file}') return await utils.answer(m, self.strings('cache_cleared'))