# `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'))