# `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 pic: https://img.icons8.com/stickers/344/block.png # meta developer: @mm_mods __version__ = "1.2" import asyncio from hikka import loader, utils import telethon as tt from telethon.tl.types import Message import logging logger = logging.getLogger(__name__) @loader.tds class MiyaHostMod(loader.Module): """Module to manage your miyahost.""" strings = { "name": "miyahost.manager", "error": "😵 Error ({}): {}", "success": "{} Your container was successfully {}! ({})", "err.NoAuthKeyProvided": "no auth key provided", "err.NoDBRecord": "you're not registered, not subscribed, or don't have a container", "err.Verlangsamt": "you're being rate limited. Try again at {}", "err.Banned": "you're banned from using this service", "err.InvalidAuthKey": "invalid auth key", "err.AuthNotEnabled": "API auth is not enabled", "err.APIServerDown": "API server isn't responding or down", "userinfo": "👤 User {}:\nSubscribed? {}\nBanned? {}", "err.NoUser": "no such user", "state.started": "started", "state.stopped": "stopped", "state.restarted": "restarted" } strings_ru = { "name": "miyahost.manager", "error": "😵 Ошибка ({}): {}", "success": "{} Контейнер успешно {}! ({})", "err.NoAuthKeyProvided": "не указан ключ авторизации", "err.NoDBRecord": "Вы не зарегистрированы, не подписаны или не имеете контейнера", "err.Verlangsamt": "Вы ограничены в использовании этого сервиса. Попробуйте снова в {}", "err.Banned": "Вы забанены", "err.InvalidAuthKey": "Неверный ключ авторизации", "err.AuthNotEnabled": "Авторизация по API не включена", "err.APIServerDown": "API сервер не отвечает или недоступен", "userinfo": "👤 Пользователь {}:\nПодписан? {}\nЗабанен? {}", "err.NoUser": "Нет такого пользователя", "_cls_doc": "Модуль для управлением вашим miyahost.", "_cmd_doc_mhinfo": "Отображает информацию о пользователе miyahost.", "_cmd_doc_mhstart": "Запускает ваш контейнер.", "_cmd_doc_mhstop": "Останавливает ваш контейнер.", "_cmd_doc_mhrestart": "Перезапускает ваш контейнер.", "state.started": "запущен", "state.stopped": "остановлен", "state.restarted": "перезапущен" } strings_de = { "name": "miyahost.manager", "error": "😵 Fehler ({}): {}", "success": "{} Ihren Kontainer würde erfolgreich {}! ({})", "err.NoAuthKeyProvided": "kein Authentifizierungsschlüssel angegeben", "err.NoDBRecord": "Sie sind nicht registriert, nicht abonniert oder haben keinen Container", "err.Verlangsamt": "Sie werden aufgrund von Rate-Limits eingeschränkt. Versuchen Sie es erneut um {}", "err.Banned": "Sie sind von der Nutzung dieses Dienstes ausgeschlossen", "err.InvalidAuthKey": "ungültiger Authentifizierungsschlüssel", "err.AuthNotEnabled": "API-Authentifizierung ist nicht aktiviert", "err.APIServerDown": "API-Server antwortet nicht oder ist nicht erreichbar", "userinfo": "👤 Nutzer {}:\nAbonniert? {}\nGebannt? {}", "err.NoUser": "kein solcher Nutzer", "_cls_doc": "Modul zum Ihren miyahost beheren.", "_cmd_doc_mhinfo": "Zeigt Informationen über den miyahost-Benutzer an.", "_cmd_doc_mhstart": "Startet Ihren Container.", "_cmd_doc_mhstop": "Stoppt Ihren Container.", "_cmd_doc_mhrestart": "Startet Ihren Container neu.", "state.started": "gestarted", "state.stopped": "gestoppt", "state.restarted": "neugestartet" } def __init__(self): self.config = loader.ModuleConfig( loader.ConfigValue( "auth_key", 'NULL', lambda: "Basic auth key for miyahost API — get it via @miyahostbot using /hhttpauth", validator=loader.validators.Hidden(loader.validators.RegExp(r'[a-zA-Z0-9]+|NULL')) ), loader.ConfigValue( "mock_id", 'NULL', lambda: "Enter another person's ID to rule it's container having it's auth key", validator=loader.validators.RegExp(r'[0-9]+|NULL') ) ) async def mhinfocmd(self, m: Message): """Get info about miyahost user.""" if not utils.get_args_raw(m) and not m.is_reply: user = m.from_id elif utils.get_args_raw(m) and not m.is_reply: user = utils.get_args_raw(m) else: user = (await m.get_reply_message()).from_id try: import requests req = requests.get(f"http://129.151.220.181:41154/mhapi/{user}").json() except Exception as e: return await utils.answer(m, self.strings("error").format(500, self.strings('err.APIServerDown'))) if list(req.keys())[0] == "error": req = req["error"] if req[0] == 404: return await utils.answer(m, self.strings("error").format(404, self.strings("err.NoUser"))) else: req = req["OK"] useri = req[1] subscr = f"✅ ({useri['datumbis']})" if useri["activated"] else "❌" banned = "✅" if useri["banned"] else "❌" return await utils.answer(m, self.strings("userinfo").format(user, subscr, banned)) async def mhstartcmd(self, m: Message): """Start miyahost container.""" mock = False user = m.from_id if self.config["auth_key"] == 'NULL': return await utils.answer(m, self.strings("error").format(403, self.strings("err.NoAuthKeyProvided"))) if self.config['mock_id'] != 'NULL': user = self.config['mock_id'] mock = True try: import requests req = requests.get( f"http://129.151.220.181:41154/mhapi/controls/start/{user}", params={"basic_key": self.config["auth_key"]} ).json() except Exception as e: return await utils.answer(m, self.strings("error").format(500, self.strings('err.APIServerDown'))) if list(req.keys())[0] == "error": req = req["error"] if req[0] == 404: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(404, self.strings("err.NoDBRecord"))) elif req[0] == 401: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(401, self.strings("err.InvalidAuthKey"))) elif req[0] == 429: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(429, self.strings("err.Verlangsamt").format(req[2]))) elif req[0] == 403 and "banned" in req[1]: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(403, self.strings("err.Banned"))) elif req[0] == 403: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(403, self.strings("err.AuthNotEnabled"))) else: emoji = '(⚫) ▶' if mock else '▶' return await utils.answer(m, self.strings("success").format(emoji, self.strings("state.started"), user)) async def mhstopcmd(self, m: Message): """Stop miyahost container.""" user = m.from_id mock = False if self.config["auth_key"] == 'NULL': return await utils.answer(m, self.strings("error").format(403, self.strings("err.NoAuthKeyProvided"))) if self.config['mock_id'] != 'NULL': user = self.config['mock_id'] mock = True emoji = '(⚫) ⏸' if mock else '⏸' await utils.answer(m, self.strings("success").format(emoji, self.strings("state.stopped"), user)) try: import requests req = requests.get( f"http://129.151.220.181:41154/mhapi/controls/stop/{user}", params={"basic_key": self.config["auth_key"]} ).json() except Exception as e: return await utils.answer(m, self.strings("error").format(500, self.strings('err.APIServerDown'))) if list(req.keys())[0] == "error": req = req["error"] if req[0] == 404: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(404, self.strings("err.NoDBRecord"))) elif req[0] == 401: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(401, self.strings("err.InvalidAuthKey"))) elif req[0] == 429: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(429, self.strings("err.Verlangsamt").format( req[2]))) elif req[0] == 403 and "banned" in req[1]: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(403, self.strings("err.Banned"))) elif req[0] == 403: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(403, self.strings("err.AuthNotEnabled"))) else: return async def mhrestartcmd(self, m: Message): """Restart miyahost container.""" user = m.from_id mock = False if self.config["auth_key"] == 'NULL': return await utils.answer(m, self.strings("error").format(403, self.strings("err.NoAuthKeyProvided"))) if self.config['mock_id'] != 'NULL': user = self.config['mock_id'] mock = True emoji = '(⚫) 🔁' if mock else '🔁' await utils.answer(m, self.strings("success").format(emoji, self.strings("state.restarted"), user)) try: import requests req = requests.get( f"http://129.151.220.181:41154/mhapi/controls/restart/{user}", params={"basic_key": self.config["auth_key"]} ).json() except Exception as e: return await utils.answer(m, self.strings("error").format(500, self.strings('err.APIServerDown'))) if list(req.keys())[0] == "error": req = req["error"] if req[0] == 404: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(404, self.strings("err.NoDBRecord"))) elif req[0] == 401: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(401, self.strings("err.InvalidAuthKey"))) elif req[0] == 429: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(429, self.strings("err.Verlangsamt").format( req[2]))) elif req[0] == 403 and "banned" in req[1]: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(403, self.strings("err.Banned"))) elif req[0] == 403: logging.error(f'Failed with request to http://129.151.220.181:41154/mhapi/controls/start/{user}?basic_key={self.config["auth_key"]}, got {req[0]}') return await utils.answer(m, self.strings("error").format(403, self.strings("err.AuthNotEnabled"))) else: return