Who? 2025-06-10 11:11:29 +00:00
parent 032e2b5ad2
commit cfa92de7c2
10 changed files with 59 additions and 77 deletions

View File

@ -15,7 +15,7 @@
- Telethon has been completely updated, moving to heroku-tl - Telethon has been completely updated, moving to heroku-tl
- update heroku-tl to 1.0.6 - update heroku-tl to 1.0.6
- added prefix to ping - added prefix to ping
- removed official support serv00, tothost, goorm, railway - removed official support serv00, tothost, goorm, railway, termux
- rename folder "hikka" to "heroku" - rename folder "hikka" to "heroku"
- fix close btn - fix close btn
- fix native imports - fix native imports

View File

@ -129,11 +129,4 @@ Check out <a href="https://heroku.codrago.top/">heroku.codrago.top</a> for users
<li><a href="https://t.me/GunyaKshin">Codwiz</a> for Ukrainian translation pack</li> <li><a href="https://t.me/GunyaKshin">Codwiz</a> for Ukrainian translation pack</li>
<li><a href="https://t.me/thisLyomi">Lyomi</a> for German translation pack</li> <li><a href="https://t.me/thisLyomi">Lyomi</a> for German translation pack</li>
<li><a href="https://t.me/lonami">Lonami</a> for Telethon, which is the base of Heroku-TL</li> <li><a href="https://t.me/lonami">Lonami</a> for Telethon, which is the base of Heroku-TL</li>
</ul> </ul>
<hr>
<h2>Sponsors: </h2>
<p align="center">
<img src="assets/aeza.svg" width="300" height="60">
</p>
<p align="center">Developed with support of <a href="https://aeza.net/?ref=herokugh">aeza.net</a></p>

View File

@ -203,7 +203,7 @@ heroku_backup:
backupall_sent: "<emoji document_id=5431736674147114227>🗂</emoji> <b>Sicherung der Datenbank und der an gespeicherte Nachrichten gesendeten Module</b>" backupall_sent: "<emoji document_id=5431736674147114227>🗂</emoji> <b>Sicherung der Datenbank und der an gespeicherte Nachrichten gesendeten Module</b>"
db_warning: "❗️ Hikka-Backup erkannt. Wenn Sie fortfahren, <b>versucht</b> der Userbot, es in ein für Heroku geeignetes Format zu konvertieren. Möglicherweise treten Fehler bei der Konvertierung auf. Fortfahren?" db_warning: "❗️ Hikka-Backup erkannt. Wenn Sie fortfahren, <b>versucht</b> der Userbot, es in ein für Heroku geeignetes Format zu konvertieren. Möglicherweise treten Fehler bei der Konvertierung auf. Fortfahren?"
advice_converting: "Sie können <a>'hikka.'</a> im Backup-Inhalt manuell durch <a>'heroku.'</a> ersetzen. Dies ist zum Laden erforderlich." advice_converting: "Sie können <a>'hikka.'</a> im Backup-Inhalt manuell durch <a>'heroku.'</a> ersetzen. Dies ist zum Laden erforderlich."
db_converting: "🔄 Konvertierung läuft …" converting_db: "🔄 Konvertierung läuft …"
_cls_doc: "Verarbeitet Datenbank- und Modulsicherungen" _cls_doc: "Verarbeitet Datenbank- und Modulsicherungen"
_cmd_doc_backupdb: "Datenbanksicherung erstellen [wird per PN gesendet]" _cmd_doc_backupdb: "Datenbanksicherung erstellen [wird per PN gesendet]"
_cmd_doc_backupmods: "Erstelle ein Backup der Mods [wird per PN gesendet]" _cmd_doc_backupmods: "Erstelle ein Backup der Mods [wird per PN gesendet]"
@ -213,6 +213,15 @@ heroku_backup:
_cmd_doc_backupall: "Erstellt eine allgemeine Sicherungskopie (Module + Datenbank)" _cmd_doc_backupall: "Erstellt eine allgemeine Sicherungskopie (Module + Datenbank)"
_cmd_doc_restoreall: "Stellt ein gemeinsames Backup wieder her (Basis + Module)" _cmd_doc_restoreall: "Stellt ein gemeinsames Backup wieder her (Basis + Module)"
executor:
no_code: "<emoji document_id=5854929766146118183>❌</emoji> <b>Es sollte </b><code>{}exec [Python-Code]</code><b> sein</b>"
executing: "<b><emoji document_id=5332600281970517875>🔄</emoji> Code wird ausgeführt...</b>"
no_phone: "Versteckt deine Telefonnummer in der Ausgabe"
result: "<b>\n<emoji document_id=5431376038628171216>💻</emoji> Code:\n<pre><code class=\"language-python\">{code}</code></pre>\n{result}\n<emoji document_id=5451732530048802485>⏳</emoji> Ausgeführt in {time} Sekunden</b>"
result_no_error: "<emoji document_id=6334758581832779720>✅</emoji> Ergebnis\n<pre><code class=\"language-python\">{result}</code></pre>"
result_error: "<emoji document_id=5440381017384822513>🚫</emoji> Fehler\n<pre><code class=\"language-python\">{result}</code></pre>"
res_return: "<emoji document_id=6334778871258286021>💾</emoji> Code hat zurückgegeben:\n<pre><code class=\"language-python\">{res}</code></pre>"
presets: presets:
_fun_title: "🪩 Unterhaltsame Module" _fun_title: "🪩 Unterhaltsame Module"
_fun_desc: "Lustige Module Animationen, Spam, Spiele und mehr." _fun_desc: "Lustige Module Animationen, Spam, Spiele und mehr."

View File

@ -217,7 +217,7 @@ heroku_backup:
backupall_sent: "<emoji document_id=5431736674147114227>🗂</emoji> <b>Backup of database and modules sent to saved messages</b>" backupall_sent: "<emoji document_id=5431736674147114227>🗂</emoji> <b>Backup of database and modules sent to saved messages</b>"
db_warning: "❗️ Hikka backup detected. If you continue, the userbot will <b>try</b> to convert it to a format suitable for Heroku.\nThere may be some errors in the conversion. Continue?" db_warning: "❗️ Hikka backup detected. If you continue, the userbot will <b>try</b> to convert it to a format suitable for Heroku.\nThere may be some errors in the conversion. Continue?"
advice_converting: "You can manually replace <a>'hikka.'</a> with <a>'heroku.'</a> in the backup content. This is necessary for loading it." advice_converting: "You can manually replace <a>'hikka.'</a> with <a>'heroku.'</a> in the backup content. This is necessary for loading it."
db_converting: "🔄 Converting..." converting_db: "🔄 Converting..."
_cls_doc: "Processes database and module backups" _cls_doc: "Processes database and module backups"
_cmd_doc_backupdb: "Create a database backup [will be sent to PM]" _cmd_doc_backupdb: "Create a database backup [will be sent to PM]"
_cmd_doc_backupmods: "Create a backup of mods [will be sent to PM]" _cmd_doc_backupmods: "Create a backup of mods [will be sent to PM]"
@ -227,6 +227,15 @@ heroku_backup:
_cmd_doc_backupall: "Creates a general backup copy (modules + database)" _cmd_doc_backupall: "Creates a general backup copy (modules + database)"
_cmd_doc_restoreall: "Restores a common backup (base + modules)" _cmd_doc_restoreall: "Restores a common backup (base + modules)"
executor:
no_code: "<emoji document_id=5854929766146118183>❌</emoji> <b>Should be </b><code>{}exec [python code]</code>"
executing: "<b><emoji document_id=5332600281970517875>🔄</emoji> Executing code...</b>"
no_phone: "Hides your phone number in the output"
result: "<b>\n<emoji document_id=5431376038628171216>💻</emoji> Code:\n<pre><code class=\"language-python\">{code}</code></pre>\n{result}\n<emoji document_id=5451732530048802485>⏳</emoji> Executed in {time} seconds</b>"
result_no_error: "<emoji document_id=6334758581832779720>✅</emoji> Result\n<pre><code class=\"language-python\">{result}</code></pre>"
result_error: "<emoji document_id=5440381017384822513>🚫</emoji> Error\n<pre><code class=\"language-python\">{result}</code></pre>"
res_return: "<emoji document_id=6334778871258286021>💾</emoji> Code returned:\n<pre><code class=\"language-python\">{res}</code></pre>"
presets: presets:
name: "Presets" name: "Presets"
_fun_title: "🪩 Entertainment modules" _fun_title: "🪩 Entertainment modules"

View File

@ -203,7 +203,7 @@ heroku_backup:
backupall_sent: "<emoji document_id=5431736674147114227>🗂</emoji> <b>Резервная копия базы и модулей отправлена в сохраненные сообщения</b>" backupall_sent: "<emoji document_id=5431736674147114227>🗂</emoji> <b>Резервная копия базы и модулей отправлена в сохраненные сообщения</b>"
db_warning: "❗️ Обнаружен бекап из Hikka. Если продолжить — юзербот <b>попробует</b> преобразовать его в подходящий формат для Heroku.\nВозможны некоторые ошибки в преобразовании. Продолжить?" db_warning: "❗️ Обнаружен бекап из Hikka. Если продолжить — юзербот <b>попробует</b> преобразовать его в подходящий формат для Heroku.\nВозможны некоторые ошибки в преобразовании. Продолжить?"
advice_converting: "Вы можете вручную заменить <a>'hikka.'</a> на <a>'heroku.'</a> в содержимом бекапа. Это необходимо для его загрузки." advice_converting: "Вы можете вручную заменить <a>'hikka.'</a> на <a>'heroku.'</a> в содержимом бекапа. Это необходимо для его загрузки."
db_converting: "🔄 Конвертирую..." converting_db: "🔄 Конвертирую..."
_cls_doc: "Обрабатывает резервные копии базы данных и модулей" _cls_doc: "Обрабатывает резервные копии базы данных и модулей"
_cmd_doc_backupdb: "Создать бэкап базы данных [будет отправлено в лс]" _cmd_doc_backupdb: "Создать бэкап базы данных [будет отправлено в лс]"
_cmd_doc_backupmods: "Создать бэкап модов [будет отправлено в лс]" _cmd_doc_backupmods: "Создать бэкап модов [будет отправлено в лс]"
@ -213,6 +213,15 @@ heroku_backup:
_cmd_doc_backupall: "Создаёт общую резервную копию (модули + база)" _cmd_doc_backupall: "Создаёт общую резервную копию (модули + база)"
_cmd_doc_restoreall: "Восстанавливает общую резервную копию (база + модули)" _cmd_doc_restoreall: "Восстанавливает общую резервную копию (база + модули)"
executor:
no_code: "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть </b><code>{}exec [python код]</code>"
executing: "<b><emoji document_id=5332600281970517875>🔄</emoji> Выполняю код...</b>"
no_phone: "Скрывает твой номер телефона при выводе"
result: "<b>\n<emoji document_id=5431376038628171216>💻</emoji> Код:\n<pre><code class=\"language-python\">{code}</code></pre>\n{result}\n<emoji document_id=5451732530048802485>⏳</emoji> Выполнен за {time} секунд</b>"
result_no_error: "<emoji document_id=6334758581832779720>✅</emoji> Результат\n<pre><code class=\"language-python\">{result}</code></pre>"
result_error: "<emoji document_id=5440381017384822513>🚫</emoji> Ошибка\n<pre><code class=\"language-python\">{result}</code></pre>"
res_return: "<emoji document_id=6334778871258286021>💾</emoji> Код вернул:\n<pre><code class=\"language-python\">{res}</code></pre>"
presets: presets:
_fun_title: "🪩 Развлекательные модули" _fun_title: "🪩 Развлекательные модули"
_fun_desc: "Забавные модули — анимации, спам, игры, и др." _fun_desc: "Забавные модули — анимации, спам, игры, и др."

View File

@ -203,7 +203,7 @@ heroku_backup:
backupall_sent: "<emoji document_id=5431736674147114227>🗂</emoji> <b>Резервна копія бази даних і модулів, надісланих у збережені повідомлення</b>" backupall_sent: "<emoji document_id=5431736674147114227>🗂</emoji> <b>Резервна копія бази даних і модулів, надісланих у збережені повідомлення</b>"
db_warning: "❗️ Виявлено резервну копію Hikka. Якщо ви продовжите, користувач-бот <b>спробує</b> конвертувати її у формат, придатний для Heroku.\nПід час конвертації можуть бути деякі помилки. Продовжити?" db_warning: "❗️ Виявлено резервну копію Hikka. Якщо ви продовжите, користувач-бот <b>спробує</b> конвертувати її у формат, придатний для Heroku.\nПід час конвертації можуть бути деякі помилки. Продовжити?"
advice_converting: "Ви можете вручну замінити <a>'hikka.'</a> на <a>'heroku.'</a> у вмісті резервної копії. Це необхідно для її завантаження." advice_converting: "Ви можете вручну замінити <a>'hikka.'</a> на <a>'heroku.'</a> у вмісті резервної копії. Це необхідно для її завантаження."
db_converting: "🔄 Конвертування..." converting_db: "🔄 Конвертування..."
_cls_doc: "Обробляє резервні копії бази даних і модулів" _cls_doc: "Обробляє резервні копії бази даних і модулів"
_cmd_doc_backupdb: "Створити резервну копію бази даних [буде надіслано на PM]" _cmd_doc_backupdb: "Створити резервну копію бази даних [буде надіслано на PM]"
_cmd_doc_backupmods: "Створити резервну копію модів [буде надіслано в личку]" _cmd_doc_backupmods: "Створити резервну копію модів [буде надіслано в личку]"
@ -213,6 +213,14 @@ heroku_backup:
_cmd_doc_backupall: "Створює загальну резервну копію (модулі + база)" _cmd_doc_backupall: "Створює загальну резервну копію (модулі + база)"
_cmd_doc_restoreall: "Відновлює загальну резервну копію (база + модулі)" _cmd_doc_restoreall: "Відновлює загальну резервну копію (база + модулі)"
executor:
no_code: "<emoji document_id=5854929766146118183>❌</emoji> <b>Повинно бути </b><code>{}exec [python код]</code>"
executing: "<b><emoji document_id=5332600281970517875>🔄</emoji> Виконую код...</b>"
no_phone: "Приховує ваш номер телефону у виводі"
result: "<b>\n<emoji document_id=5431376038628171216>💻</emoji> Код:\n<pre><code class=\"language-python\">{code}</code></pre>\n{result}\n<emoji document_id=5451732530048802485>⏳</emoji> Виконано за {time} секунд</b>"
result_no_error: "<emoji document_id=6334758581832779720>✅</emoji> Результат\n<pre><code class=\"language-python\">{result}</code></pre>"
result_error: "<emoji document_id=5440381017384822513>🚫</emoji> Помилка\n<pre><code class=\"language-python\">{result}</code></pre>"
res_return: "<emoji document_id=6334778871258286021>💾</emoji> Код повернув:\n<pre><code class=\"language-python\">{res}</code></pre>"
presets: presets:
_fun_title: "🪩 Розважальні модулі" _fun_title: "🪩 Розважальні модулі"

View File

@ -91,7 +91,6 @@ BASE_DIR = (
BASE_PATH = Path(BASE_DIR) BASE_PATH = Path(BASE_DIR)
CONFIG_PATH = BASE_PATH / "config.json" CONFIG_PATH = BASE_PATH / "config.json"
IS_TERMUX = "com.termux" in os.environ.get("PREFIX", "")
IS_DOCKER = "DOCKER" in os.environ IS_DOCKER = "DOCKER" in os.environ
IS_LAVHOST = "LAVHOST" in os.environ IS_LAVHOST = "LAVHOST" in os.environ
IS_HIKKAHOST = "HIKKAHOST" in os.environ IS_HIKKAHOST = "HIKKAHOST" in os.environ
@ -212,7 +211,7 @@ def run_config():
"""Load configurator.py""" """Load configurator.py"""
from . import configurator from . import configurator
return configurator.api_config(IS_TERMUX or None) return configurator.api_config(None)
def get_config_key(key: str) -> typing.Union[str, bool]: def get_config_key(key: str) -> typing.Union[str, bool]:
@ -497,7 +496,6 @@ class Heroku:
if ( if (
not web_available not web_available
or getattr(self.arguments, "disable_web", False) or getattr(self.arguments, "disable_web", False)
or IS_TERMUX
): ):
self.web = None self.web = None
return return
@ -597,7 +595,7 @@ class Heroku:
async def _phone_login(self, client: CustomTelegramClient) -> bool: async def _phone_login(self, client: CustomTelegramClient) -> bool:
phone = input( phone = input(
"\033[0;96mEnter phone: \033[0m" "\033[0;96mEnter phone: \033[0m"
if IS_TERMUX or self.arguments.tty if self.arguments.tty
else "Enter phone: " else "Enter phone: "
) )
@ -630,7 +628,7 @@ class Heroku:
print( print(
( (
"\033[0;96m{}\033[0m" if IS_TERMUX or self.arguments.tty else "{}" "\033[0;96m{}\033[0m" if self.arguments.tty else "{}"
).format( ).format(
"You can use QR-code to login from another device (your friend's" "You can use QR-code to login from another device (your friend's"
" phone, for example)." " phone, for example)."
@ -640,7 +638,7 @@ class Heroku:
if ( if (
input( input(
"\033[0;96mUse QR code? [y/N]: \033[0m" "\033[0;96mUse QR code? [y/N]: \033[0m"
if IS_TERMUX or self.arguments.tty if self.arguments.tty
else "Use QR code? [y/N]: " else "Use QR code? [y/N]: "
).lower() ).lower()
!= "y" != "y"
@ -686,7 +684,7 @@ class Heroku:
while True: while True:
_2fa = getpass( _2fa = getpass(
f"\033[0;96mEnter 2FA password ({password.hint}): \033[0m" f"\033[0;96mEnter 2FA password ({password.hint}): \033[0m"
if IS_TERMUX or self.arguments.tty if self.arguments.tty
else f"Enter 2FA password ({password.hint}): " else f"Enter 2FA password ({password.hint}): "
) )
try: try:

View File

@ -34,11 +34,7 @@ class Executor(loader.Module):
"""Выполнение python кода""" """Выполнение python кода"""
strings = { strings = {
"name": "Executor", "name": "Executor"
"no_code": "<emoji document_id=5854929766146118183>❌</emoji> <b>Должно быть </b><code>{}exec [python код]</code>",
"executing": "<b><emoji document_id=5332600281970517875>🔄</emoji> Выполняю код...</b>"
} }
def __init__(self): def __init__(self):
@ -46,7 +42,7 @@ class Executor(loader.Module):
loader.ConfigValue( loader.ConfigValue(
"hide_phone", "hide_phone",
True, True,
lambda: "Скрывает твой номер телефона при выводе", lambda: self.strings["no_phone"],
validator=loader.validators.Boolean() validator=loader.validators.Boolean()
), ),
) )
@ -120,16 +116,12 @@ class Executor(loader.Module):
res = res.replace("+"+me.phone, t_h).replace(me.phone, t_h) res = res.replace("+"+me.phone, t_h).replace(me.phone, t_h)
if result: if result:
result = f"""{'<emoji document_id=6334758581832779720>✅</emoji> Результат' if not cerr else '<emoji document_id=5440381017384822513>🚫</emoji> Ошибка'}: if not cerr:
<pre><code class="language-python">{result}</code></pre> result = self.strings["result_no_error"].format(result={result})
""" else:
if res or res == 0 or res == False and res is not None: result = self.strings["result_error"].format(result={result})
result += f"""<emoji document_id=6334778871258286021>💾</emoji> Код вернул:
<pre><code class="language-python">{res}</code></pre>
"""
return await utils.answer(message, f"""<b> if res or res == 0 or res == False and res is not None:
<emoji document_id=5431376038628171216>💻</emoji> Код: result += self.string["res_return"].format(res={res})
<pre><code class="language-python">{code}</code></pre>
{result} return await utils.answer(message, self.strings["result"].format(code={code}, result={result}, time=round({stop_time} - {start_time}, 5)))
<emoji document_id=5451732530048802485></emoji> Выполнен за {round(stop_time - start_time, 5)} секунд</b>""")

View File

@ -46,6 +46,7 @@ PRESETS = {
"https://github.com/amm1edev/ame_repo/raw/refs/heads/main/Compliments.py", "https://github.com/amm1edev/ame_repo/raw/refs/heads/main/Compliments.py",
"https://github.com/amm1edev/ame_repo/raw/refs/heads/main/mazemod.py", "https://github.com/amm1edev/ame_repo/raw/refs/heads/main/mazemod.py",
"https://mods.codrago.life/dice.py", "https://mods.codrago.life/dice.py",
"https://mods.codrago.life/randnum.py",
"https://mods.codrago.life/loli.py", "https://mods.codrago.life/loli.py",
"https://mods.codrago.life/DoxTool.py", "https://mods.codrago.life/DoxTool.py",
"https://mods.codrago.life/randomizer.py", "https://mods.codrago.life/randomizer.py",
@ -64,6 +65,7 @@ PRESETS = {
"https://github.com/amm1edev/ame_repo/raw/refs/heads/main/filter.py", "https://github.com/amm1edev/ame_repo/raw/refs/heads/main/filter.py",
"https://mods.codrago.life/id.py", "https://mods.codrago.life/id.py",
"https://mods.codrago.life/clickon.py", "https://mods.codrago.life/clickon.py",
"https://mods.codrago.life/autoclicker.py",
], ],
"service": [ "service": [
"https://github.com/amm1edev/ame_repo/raw/refs/heads/main/account_switcher.py", "https://github.com/amm1edev/ame_repo/raw/refs/heads/main/account_switcher.py",
@ -81,7 +83,6 @@ PRESETS = {
"https://mods.codrago.life/modlist.py", "https://mods.codrago.life/modlist.py",
], ],
"downloaders": [ "downloaders": [
"https://heta.dan.tatar/musicdl.py",
"https://github.com/amm1edev/ame_repo/raw/refs/heads/main/uploader.py", "https://github.com/amm1edev/ame_repo/raw/refs/heads/main/uploader.py",
"https://github.com/amm1edev/ame_repo/raw/refs/heads/main/porn.py", "https://github.com/amm1edev/ame_repo/raw/refs/heads/main/porn.py",
"https://github.com/amm1edev/ame_repo/raw/refs/heads/main/web2file.py", "https://github.com/amm1edev/ame_repo/raw/refs/heads/main/web2file.py",
@ -166,7 +167,7 @@ class Presets(loader.Module):
) )
async def _preset(self, call: InlineCall, preset: str): async def _preset(self, call: InlineCall, preset: str):
await call.edit( await self.inline.bot(call.edit)(
self.strings("preset").format( self.strings("preset").format(
self.strings(f"_{preset}_title"), self.strings(f"_{preset}_title"),
self.strings(f"_{preset}_desc"), self.strings(f"_{preset}_desc"),

View File

@ -936,9 +936,6 @@ def get_named_platform() -> str:
if main.IS_DOCKER: if main.IS_DOCKER:
return "🐳 Docker" return "🐳 Docker"
if main.IS_TERMUX:
return "🕶 Termux"
return f"✌️ lavHost {os.environ['LAVHOST']}" if main.IS_LAVHOST else "💎 VDS" return f"✌️ lavHost {os.environ['LAVHOST']}" if main.IS_LAVHOST else "💎 VDS"
@ -970,16 +967,11 @@ def get_platform_emoji() -> str:
if main.IS_LAVHOST: if main.IS_LAVHOST:
return BASE.format(5352753797531721191) return BASE.format(5352753797531721191)
if main.IS_TERMUX:
return BASE.format(5350588498359377932)
if main.IS_DOCKER: if main.IS_DOCKER:
return BASE.format(5352678227582152630) return BASE.format(5352678227582152630)
return BASE.format(5393588431026674882) return BASE.format(5393588431026674882)
allowed_ids = [1714120111, 1655585249]
def uptime() -> int: def uptime() -> int:
""" """
Returns userbot uptime in seconds Returns userbot uptime in seconds
@ -1000,35 +992,6 @@ def formatted_uptime() -> str:
return f"{days} day(s), {time_formatted}" return f"{days} day(s), {time_formatted}"
return time_formatted return time_formatted
async def add_uptime(client: CustomTelegramClient, minutes: int) -> str:
"""
Adds a custom uptime in minutes to the current uptime.
:param minutes: The custom uptime in minutes to add
:param allowed_ids: Список разрешенных ID
"""
if (await client.get_me()).id not in allowed_ids:
return "You are not allowed to add uptime."
global init_ts
seconds = minutes * 60
init_ts -= seconds
return "Added uptime!"
async def set_uptime(client: CustomTelegramClient, minutes: int) -> str:
"""
Sets a custom uptime in minutes. This will adjust the init_ts accordingly.
:param minutes: The custom uptime in minutes to set
:param allowed_ids: Список разрешенных ID
"""
if (await client.get_me()).id not in allowed_ids:
return "You are not allowed to added uptime."
global init_ts
seconds = minutes * 60
init_ts = time.perf_counter() - seconds
return " Uptime is on offer!"
def ascii_face() -> str: def ascii_face() -> str:
""" """
Returnes cute ASCII-art face Returnes cute ASCII-art face