# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀
# █▀█ █ █ █ █▀█ █▀▄ █
# © Copyright 2022
# https://t.me/hikariatama
#
# 🔒 Licensed under the GNU AGPLv3
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
import re
import string
from telethon.errors.rpcerrorlist import YouBlockedUserError
from telethon.tl.functions.contacts import UnblockRequest
from telethon.tl.types import Message
from .. import loader, utils
from ..inline.types import BotInlineMessage
@loader.tds
class InlineStuffMod(loader.Module):
"""Provides support for inline stuff"""
strings = {
"name": "InlineStuff",
"bot_username_invalid": (
"🚫 Specified bot"
" username is invalid. It must end with bot
and contain"
" at least 4 symbols"
),
"bot_username_occupied": (
"🚫 This username is"
" already occupied"
),
"bot_updated": (
"🎉 Config successfully"
" saved. Restart userbot to apply changes"
),
"this_is_hikka": (
"🌘 Hi! This is Hikka — powerful modular Telegram userbot. You can"
" install it to your account!\n\n🌍 GitHub\n👥 Support chat'
),
}
strings_ru = {
"bot_username_invalid": (
"🚫 Неправильный ник"
" бота. Он должен заканчиваться на bot
и быть не короче"
" чем 5 символов"
),
"bot_username_occupied": (
"🚫 Такой ник бота уже"
" занят"
),
"bot_updated": (
"🎉 Настройки сохранены."
" Для их применения нужно перезагрузить юзербот"
),
"this_is_hikka": (
"🌘 Привет! Это Hikka — мощный модульный Telegram юзербот. Вы можете"
" установить его на свой аккаунт!\n\n🌍 GitHub\n👥 Чат поддержки'
),
}
strings_de = {
"bot_username_invalid": (
"🚫 Der angegebene"
" Benutzername ist ungültig. Er muss mit bot
enden und"
" mindestens 4 Zeichen lang sein"
),
"bot_username_occupied": (
"🚫 Dieser Benutzername"
" ist bereits vergeben"
),
"bot_updated": (
"🎉 Erfolgreich"
" gespeichert. Starte den Userbot neu, um die Änderungen zu übernehmen"
),
"this_is_hikka": (
"🌘 Hallo! Das ist Hikka — mächtiger modulare Telegram Userbot. Du kannst"
" ihn auf deinen Account installieren!\n\n🌍 GitHub\n👥 Support Chat'
),
}
strings_tr = {
"bot_username_invalid": (
"🚫 Belirtilen bot"
" kullanıcı adı geçersiz. bot
ile bitmelidir ve en az"
" 4 karakter içermelidir"
),
"bot_username_occupied": (
"🚫 Bu kullanıcı adı"
" zaten alınmış"
),
"bot_updated": (
"🎉 Yapılandırma başarıyla"
" kaydedildi. Değişiklikleri uygulamak için botu yeniden başlatın"
),
"this_is_hikka": (
"🌘 Merhaba! Bu Hikka — güçlü modüler Telegram kullanıcısı. Hesabınıza"
" kurabilirsiniz!\n\n🌍 GitHub\n👥 Destek sohbeti'
),
}
strings_hi = {
"bot_username_invalid": (
"🚫 बॉट उपयोगकर्ता"
" नाम अवैध है। यह bot
से समाप्त होना चाहिए और न्यूनतम"
" 4 वर्णों का होना चाहिए"
),
"bot_username_occupied": (
"🚫 यह उपयोगकर्ता नाम पहले"
" से ही ले लिया गया है"
),
"bot_updated": (
"🎉 कॉन्फ़िगरेशन"
" सफलतापूर्वक सहेजा गया। इसे लागू करने के लिए बॉट को रीस्टार्ट करें"
),
"this_is_hikka": (
"🌘 नमस्ते! यह Hikka है — एक मजबूत और मॉड्यूलर टेलीग्राम यूजरबॉट। आप इसे"
" अपने अकाउंट पर इंस्टॉल कर सकते हैं!\n\n🌍 GitHub\n👥 सपोर्ट चैट'
),
}
strings_uz = {
"bot_username_invalid": (
"🚫 Bot foydalanuvchi"
" nomi noto'g'ri. U bot
bilan tugashi kerak va kamida 4"
" belgidan iborat bo'lishi kerak"
),
"bot_username_occupied": (
"🚫 Ushbu foydalanuvchi"
" nomi allaqachon band"
),
"bot_updated": (
"🎉 Konfiguratsiya"
" muvaffaqiyatli saqlandi. Ushbu o'zgarishlarni qo'llash uchun botni qayta"
" ishga tushiring"
),
"this_is_hikka": (
"🌘 Salom! Bu Hikka — kuchli modulyor Telegram foydalanuvchisi. Siz uni"
" o'zingizga o'rnatishingiz mumkin!\n\n🌍 GitHub\n👥 Yordam chati'
),
}
async def watcher(self, message: Message):
if (
getattr(message, "out", False)
and getattr(message, "via_bot_id", False)
and message.via_bot_id == self.inline.bot_id
and "This message will be deleted automatically"
in getattr(message, "raw_text", "")
):
await message.delete()
return
if (
not getattr(message, "out", False)
or not getattr(message, "via_bot_id", False)
or message.via_bot_id != self.inline.bot_id
or "Opening gallery..." not in getattr(message, "raw_text", "")
):
return
id_ = re.search(r"#id: ([a-zA-Z0-9]+)", message.raw_text)[1]
await message.delete()
m = await message.respond("🌘")
await self.inline.gallery(
message=m,
next_handler=self.inline._custom_map[id_]["handler"],
caption=self.inline._custom_map[id_].get("caption", ""),
force_me=self.inline._custom_map[id_].get("force_me", False),
disable_security=self.inline._custom_map[id_].get(
"disable_security", False
),
silent=True,
)
async def _check_bot(self, username: str) -> bool:
async with self._client.conversation("@BotFather", exclusive=False) as conv:
try:
m = await conv.send_message("/token")
except YouBlockedUserError:
await self._client(UnblockRequest(id="@BotFather"))
m = await conv.send_message("/token")
r = await conv.get_response()
await m.delete()
await r.delete()
if not hasattr(r, "reply_markup") or not hasattr(r.reply_markup, "rows"):
return False
for row in r.reply_markup.rows:
for button in row.buttons:
if username != button.text.strip("@"):
continue
m = await conv.send_message("/cancel")
r = await conv.get_response()
await m.delete()
await r.delete()
return True
@loader.command(
ru_doc="<юзернейм> - Изменить юзернейм инлайн бота",
de_doc=" - Ändere den Inline-Bot-Nutzernamen",
tr_doc=" - İçe aktarma botunun kullanıcı adını değiştirin",
hi_doc="<उपयोगकर्ता नाम> - इनलाइन बॉट का उपयोगकर्ता नाम बदलें",
uz_doc=" - Bot foydalanuvchi nomini o'zgartiring",
)
async def ch_hikka_bot(self, message: Message):
""" - Change your Hikka inline bot username"""
args = utils.get_args_raw(message).strip("@")
if (
not args
or not args.lower().endswith("bot")
or len(args) <= 4
or any(
litera not in (string.ascii_letters + string.digits + "_")
for litera in args
)
):
await utils.answer(message, self.strings("bot_username_invalid"))
return
try:
await self._client.get_entity(f"@{args}")
except ValueError:
pass
else:
if not await self._check_bot(args):
await utils.answer(message, self.strings("bot_username_occupied"))
return
self._db.set("hikka.inline", "custom_bot", args)
self._db.set("hikka.inline", "bot_token", None)
await utils.answer(message, self.strings("bot_updated"))
async def aiogram_watcher(self, message: BotInlineMessage):
if message.text != "/start":
return
await message.answer_photo(
"https://github.com/hikariatama/assets/raw/master/hikka_banner.png",
caption=self.strings("this_is_hikka"),
)
async def client_ready(self):
if self.get("migrated"):
return
self.set("migrated", True)
async with self._client.conversation("@BotFather") as conv:
for msg in [
"/cancel",
"/setinline",
f"@{self.inline.bot_username}",
"user@hikka:~$",
]:
m = await conv.send_message(msg)
r = await conv.get_response()
await m.delete()
await r.delete()