__version__ = (0, 1, 24)
# ▄▀█ █▄ █ █▀█ █▄ █ █▀█ ▀▀█ █▀█ █ █ █▀
# █▀█ █ ▀█ █▄█ █ ▀█ ▀▀█ █ ▀▀█ ▀▀█ ▄█
#
# © Copyright 2024
#
# developed by @anon97945
#
# https://t.me/apodiktum_modules
# https://github.com/anon97945
#
# 🔒 Licensed under the GNU GPLv3
# 🌐 https://www.gnu.org/licenses/gpl-3.0.html
# meta developer: @apodiktum_modules
# meta banner: https://t.me/apodiktum_dumpster/11
# meta pic: https://t.me/apodiktum_dumpster/13
# scope: inline
# scope: hikka_only
# scope: hikka_min 1.3.3
import logging
import git
from telethon.tl.types import Message
from telethon.utils import get_display_name
from .. import loader, main, utils
logger = logging.getLogger(__name__)
@loader.tds
class ApodiktumInfoMod(loader.Module):
"""
Show userbot info
"""
strings = {
"name": "Apo-Info",
"developer": "@anon97945",
"_cfg_banner": "Set `True` in order to disable an media banner.",
"_cfg_cst_auto_migrate": "Wheather to auto migrate defined changes on startup.",
"_cfg_cst_bnr": "Custom Banner.",
"_cfg_cst_btn": "Custom button. Leave empty to remove button.",
"_cfg_cst_frmt": "Custom fileformat for Banner.",
"_cfg_cst_msg": (
"Custom message for info. May contain {me}, {version}, {build},"
" {prefix}, {platform}, {upd}, {uptime} keywords."
),
"_cfg_inline_banner": "Set `True` in order to disable an inline media banner.",
"build": "Build",
"description": "ℹ This will not compromise any sensitive info.",
"owner": "Owner",
"prefix": "Prefix",
"send_info": "Send userbot info.",
"up-to-date": "😌 Up-to-date.",
"update_required": "😕 Update required: {}update",
"uptime": "Uptime",
"version": "Version",
}
strings_en = {}
strings_de = {
"_cfg_banner": "Setzen Sie `True`, um das Media Banner zu deaktivieren.",
"_cfg_cst_bnr": "Benutzerdefiniertes Banner.",
"_cfg_cst_btn": (
"Benutzerdefinierte Schaltfläche für Informationen. Leer lassen, um"
" die Schaltfläche zu entfernen."
),
"_cfg_cst_frmt": "Benutzerdefiniertes Dateiformat für das Banner.",
"_cfg_cst_msg": (
"Benutzerdefinierte Nachricht für Info. Kann die Schlüsselwörter"
" {me}, {version}, {build}, {prefix}, {platform}, {upd}, {uptime}"
" enthalten."
),
"_cfg_inline_banner": (
"Setzen Sie `True`, um das Inline Media Banner zu deaktivieren."
),
"_cmd_doc_capoinfo": "Dadurch wird die Konfiguration für das Modul geöffnet.",
"_ihandle_doc_info": "Отправить информацию о юзерботе",
"build": "Build",
"description": "ℹ Dadurch werden keine sensiblen Daten gefährdet.",
"owner": "Eigentümer",
"prefix": "Prefix",
"send_info": "Benutzerbot-Informationen senden.",
"up-to-date": "😌 Up-to-date",
"update_required": "😕 Aktualisierung erforderlich: {}update",
"uptime": "Betriebszeit",
"version": "Version",
}
strings_ru = {
"_cfg_banner": "Поставь `True`, чтобы отключить баннер-картинку.",
"_cfg_cst_bnr": "Кастомный баннер.",
"_cfg_cst_btn": (
"Кастомная кнопка в сообщении в info. Оставь пустым, чтобы убрать кнопку."
),
"_cfg_cst_frmt": "Кастомный формат файла для баннера.",
"_cfg_cst_msg": (
"Кастомный текст сообщения в info. Может содержать ключевые слова"
" {me}, {version}, {build}, {prefix}, {platform}, {upd}, {uptime}."
),
"_cfg_inline_banner": (
"Установите `True`, чтобы отключить встроенный медиа-баннер"
),
"_cmd_doc_capoinfo": "Это откроет конфиг для модуля.",
"_ihandle_doc_info": "Отправить информацию о юзерботе.",
"build": "Сборка",
"description": "ℹ Это не раскроет никакой личной информации.",
"owner": "Владелец",
"prefix": "Префикс",
"send_info": "Отправить информацию о юзерботе.",
"up-to-date": "😌 Актуальная версия.",
"update_required": "😕 Требуется обновление: {}update",
"uptime": "Аптайм",
"version": "Версия",
}
all_strings = {
"strings": strings,
"strings_en": strings,
"strings_de": strings_de,
"strings_ru": strings_ru,
}
changes = {
"migration1": {
"name": {
"old": "Apo Info",
"new": "Apo-Info",
},
},
}
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"custom_banner",
"https://t.me/apodiktum_dumpster/6",
lambda: self.strings("_cfg_cst_bnr"),
validator=loader.validators.Link(),
),
loader.ConfigValue(
"custom_format",
"video",
lambda: self.strings("_cfg_cst_frmt"),
validator=loader.validators.Choice(["photo", "video", "audio", "gif"]),
),
loader.ConfigValue(
"custom_message",
None,
doc=lambda: self.strings("_cfg_cst_msg"),
validator=loader.validators.Union(
loader.validators.String(),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"disable_banner",
False,
lambda: self.strings("_cfg_banner"),
validator=loader.validators.Boolean(),
),
loader.ConfigValue(
"disable_inline_banner",
False,
lambda: self.strings("_cfg_inline_banner"),
validator=loader.validators.Boolean(),
),
loader.ConfigValue(
"custom_button1",
[
"🔥 Apodiktum Hikka Modules 🔥",
"https://t.me/apodiktum_modules",
],
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button2",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button3",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button4",
["🌘 Hikka EN Support chat", "https://t.me/hikka_en"],
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button5",
["🌘 Hikka. userbot", "https://t.me/hikka_ub"],
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button6",
["🌘 Hikka RU Support chat", "https://t.me/hikka_talks"],
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button7",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button8",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button9",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button10",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button11",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"custom_button12",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"auto_migrate",
True,
doc=lambda: self.strings("_cfg_cst_auto_migrate"),
validator=loader.validators.Boolean(),
), # for MigratorClass
)
async def client_ready(self, client, _):
self.apo_lib = await self.import_lib(
"https://raw.githubusercontent.com/anon97945/hikka-libs/master/apodiktum_library.py",
suspend_on_error=True,
)
await self.apo_lib.migrator.auto_migrate_handler(
self.__class__.__name__,
self.strings("name"),
self.changes,
self.config["auto_migrate"],
)
self._me = await client.get_me()
def _render_info(self) -> str:
ver = utils.get_git_hash() or "Unknown"
try:
repo = git.Repo()
diff = repo.git.log(["HEAD..origin/master", "--oneline"])
upd = (
self.strings("update_required").format(
utils.escape_html(self.get_prefix())
)
if diff
else self.strings("up-to-date")
)
except Exception:
upd = ""
me = (
"{utils.escape_html(get_display_name(self._me))}'
)
version = f'{".".join(list(map(str, list(main.__version__))))}'
build = f'#{ver[:8]}' # fmt: skip
prefix = f"«{utils.escape_html(self.get_prefix())}»"
platform = utils.get_named_platform()
uptime = self.apo_lib.utils.get_uptime(short=True)
return (
self.config["custom_message"].format(
me=me,
version=version,
build=build,
prefix=prefix,
platform=platform,
upd=upd,
uptime=uptime,
)
if self.config["custom_message"] and self.config["custom_message"] != "no"
else (
"🌚 Apodiktum Hikka Info\n"
f"🤴 {self.strings('owner')}: {me}\n\n"
f"🕰 {self.strings('uptime')}: {uptime}\n"
f"🔮 {self.strings('version')}: {version} {build}\n"
f"{upd}\n\n"
f"📼 {self.strings('prefix')}: {prefix}\n"
f"{platform}\n"
)
)
def _get_mark(self, btn_count: int) -> dict:
btn_count = str(btn_count)
return (
{
"text": self.config[f"custom_button{btn_count}"][0],
"url": self.config[f"custom_button{btn_count}"][1],
}
if self.config[f"custom_button{btn_count}"]
else None
)
@loader.inline_everyone
async def apoinfo_inline_handler(self, _) -> dict:
"""Send userbot info"""
m = {x: self._get_mark(x) for x in range(13)}
btns = [
[
*([m[1]] if m[1] else []),
*([m[2]] if m[2] else []),
*([m[3]] if m[3] else []),
],
[
*([m[4]] if m[4] else []),
*([m[5]] if m[5] else []),
*([m[6]] if m[6] else []),
],
[
*([m[7]] if m[7] else []),
*([m[8]] if m[8] else []),
*([m[9]] if m[9] else []),
],
[
*([m[10]] if m[10] else []),
*([m[11]] if m[11] else []),
*([m[12]] if m[12] else []),
],
]
msg_type = "message" if self.config["disable_inline_banner"] else "caption"
return {
"title": self.strings("send_info"),
"description": self.strings("description"),
msg_type: self._render_info(),
self.config["custom_format"]: self.config["custom_banner"],
"thumb": (
"https://github.com/hikariatama/Hikka/raw/master/assets/hikka_pfp.png"
),
"reply_markup": btns,
}
async def capoinfocmd(self, message: Message):
"""
This will open the config for the module.
"""
name = self.strings("name")
await self.allmodules.commands["config"](
await utils.answer(message, f"{self.get_prefix()}config {name}")
)
@loader.unrestricted
async def apoinfocmd(self, message: Message):
"""Send userbot info"""
m = {x: self._get_mark(x) for x in range(13)}
btns = [
[
*([m[1]] if m[1] else []),
*([m[2]] if m[2] else []),
*([m[3]] if m[3] else []),
],
[
*([m[4]] if m[4] else []),
*([m[5]] if m[5] else []),
*([m[6]] if m[6] else []),
],
[
*([m[7]] if m[7] else []),
*([m[8]] if m[8] else []),
*([m[9]] if m[9] else []),
],
[
*([m[10]] if m[10] else []),
*([m[11]] if m[11] else []),
*([m[12]] if m[12] else []),
],
]
await self.inline.form(
message=message,
text=self._render_info(),
reply_markup=btns,
**{}
if self.config["disable_banner"]
else {self.config["custom_format"]: self.config["custom_banner"]},
)