inline_stuff.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. # █ █ ▀ █▄▀ ▄▀█ █▀█ ▀
  2. # █▀█ █ █ █ █▀█ █▀▄ █
  3. # © Copyright 2022
  4. # https://t.me/hikariatama
  5. #
  6. # 🔒 Licensed under the GNU AGPLv3
  7. # 🌐 https://www.gnu.org/licenses/agpl-3.0.html
  8. import re
  9. import string
  10. from telethon.errors.rpcerrorlist import YouBlockedUserError
  11. from telethon.tl.functions.contacts import UnblockRequest
  12. from telethon.tl.types import Message
  13. from .. import loader, utils
  14. from ..inline.types import BotInlineMessage
  15. @loader.tds
  16. class InlineStuffMod(loader.Module):
  17. """Provides support for inline stuff"""
  18. strings = {
  19. "name": "InlineStuff",
  20. "bot_username_invalid": (
  21. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Specified bot"
  22. " username is invalid. It must end with </b><code>bot</code><b> and contain"
  23. " at least 4 symbols</b>"
  24. ),
  25. "bot_username_occupied": (
  26. "<emoji document_id=5415905755406539934>🚫</emoji> <b>This username is"
  27. " already occupied</b>"
  28. ),
  29. "bot_updated": (
  30. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Config successfully"
  31. " saved. Restart userbot to apply changes</b>"
  32. ),
  33. "this_is_hikka": (
  34. "🌘 <b>Hi! This is Hikka — powerful modular Telegram userbot. You can"
  35. " install it to your account!</b>\n\n<b>🌍 <a"
  36. ' href="https://github.com/hikaraitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  37. ' href="https://t.me/hikka_talks">Support chat</a></b>'
  38. ),
  39. }
  40. strings_ru = {
  41. "bot_username_invalid": (
  42. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Неправильный ник"
  43. " бота. Он должен заканчиваться на </b><code>bot</code><b> и быть не короче"
  44. " чем 5 символов</b>"
  45. ),
  46. "bot_username_occupied": (
  47. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Такой ник бота уже"
  48. " занят</b>"
  49. ),
  50. "bot_updated": (
  51. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Настройки сохранены."
  52. " Для их применения нужно перезагрузить юзербот</b>"
  53. ),
  54. "this_is_hikka": (
  55. "🌘 <b>Привет! Это Hikka — мощный модульный Telegram юзербот. Вы можете"
  56. " установить его на свой аккаунт!</b>\n\n<b>🌍 <a"
  57. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  58. ' href="https://t.me/hikka_talks">Чат поддержки</a></b>'
  59. ),
  60. }
  61. strings_de = {
  62. "bot_username_invalid": (
  63. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Der angegebene"
  64. " Benutzername ist ungültig. Er muss mit </b><code>bot</code><b> enden und"
  65. " mindestens 4 Zeichen lang sein</b>"
  66. ),
  67. "bot_username_occupied": (
  68. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Dieser Benutzername"
  69. " ist bereits vergeben</b>"
  70. ),
  71. "bot_updated": (
  72. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Erfolgreich"
  73. " gespeichert. Starte den Userbot neu, um die Änderungen zu übernehmen</b>"
  74. ),
  75. "this_is_hikka": (
  76. "🌘 <b>Hallo! Das ist Hikka — mächtiger modulare Telegram Userbot. Du kannst"
  77. " ihn auf deinen Account installieren!</b>\n\n<b>🌍 <a"
  78. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  79. ' href="https://t.me/hikka_talks">Support Chat</a></b>'
  80. ),
  81. }
  82. strings_tr = {
  83. "bot_username_invalid": (
  84. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Belirtilen bot"
  85. " kullanıcı adı geçersiz. Botun adı </b><code>bot</code><b> ile bitmeli ve"
  86. " en az 4 karakter içermelidir</b>"
  87. ),
  88. "bot_username_occupied": (
  89. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Bu kullanıcı adı"
  90. " zaten alınmış</b>"
  91. ),
  92. "bot_updated": (
  93. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Yapılandırma başarıyla"
  94. " kaydedildi. Değişiklikleri uygulamak için botu yeniden başlatın</b>"
  95. ),
  96. "this_is_hikka": (
  97. "🌘 <b>Merhaba! Bu Hikka — güçlü modüler Telegram kullanıcı botu. Hesabınıza"
  98. " kurup, kullanabilirsiniz!</b>\n\n<b>🌍 <a"
  99. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  100. ' href="https://t.me/hikka_talks">Destek sohbeti</a></b>'
  101. ),
  102. }
  103. strings_hi = {
  104. "bot_username_invalid": (
  105. "<emoji document_id=5415905755406539934>🚫</emoji> <b>बॉट उपयोगकर्ता"
  106. " नाम अवैध है। यह </b><code>bot</code><b> से समाप्त होना चाहिए और न्यूनतम"
  107. " 4 वर्णों का होना चाहिए</b>"
  108. ),
  109. "bot_username_occupied": (
  110. "<emoji document_id=5415905755406539934>🚫</emoji> <b>यह उपयोगकर्ता नाम पहले"
  111. " से ही ले लिया गया है</b>"
  112. ),
  113. "bot_updated": (
  114. "<emoji document_id=6318792204118656433>🎉</emoji> <b>कॉन्फ़िगरेशन"
  115. " सफलतापूर्वक सहेजा गया। इसे लागू करने के लिए बॉट को रीस्टार्ट करें</b>"
  116. ),
  117. "this_is_hikka": (
  118. "🌘 <b>नमस्ते! यह Hikka है — एक मजबूत और मॉड्यूलर टेलीग्राम यूजरबॉट। आप इसे"
  119. " अपने अकाउंट पर इंस्टॉल कर सकते हैं!</b>\n\n<b>🌍 <a"
  120. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  121. ' href="https://t.me/hikka_talks">सपोर्ट चैट</a></b>'
  122. ),
  123. }
  124. strings_uz = {
  125. "bot_username_invalid": (
  126. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Bot foydalanuvchi"
  127. " nomi noto'g'ri. U </b><code>bot</code><b> bilan tugashi kerak va kamida 4"
  128. " belgidan iborat bo'lishi kerak</b>"
  129. ),
  130. "bot_username_occupied": (
  131. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Ushbu foydalanuvchi"
  132. " nomi allaqachon band</b>"
  133. ),
  134. "bot_updated": (
  135. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Konfiguratsiya"
  136. " muvaffaqiyatli saqlandi. Ushbu o'zgarishlarni qo'llash uchun botni qayta"
  137. " ishga tushiring</b>"
  138. ),
  139. "this_is_hikka": (
  140. "🌘 <b>Salom! Bu Hikka - kuchli modulli Telegram userboti. Siz uni"
  141. " o'zingizni akkauntingizga o'rnatishingiz mumkin!</b>\n\n<b>🌍 <a"
  142. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  143. ' href="https://t.me/hikka_talks">Yordam chati</a></b>'
  144. ),
  145. }
  146. strings_ja = {
  147. "bot_username_invalid": (
  148. "<emoji document_id=5415905755406539934>🚫</emoji> <b>ボットのユーザー名が"
  149. "無効です。それは</b><code>bot</code><b>で終わり、少なくとも4文字でなければなりません</b>"
  150. ),
  151. "bot_username_occupied": (
  152. "<emoji document_id=5415905755406539934>🚫</emoji> <b>このユーザー名はすでに"
  153. "使用されています</b>"
  154. ),
  155. "bot_updated": (
  156. "<emoji document_id=6318792204118656433>🎉</emoji> <b>設定が正常に保存されました。"
  157. "変更を適用するには、ボットを再起動してください</b>"
  158. ),
  159. "this_is_hikka": (
  160. "🌘 <b>こんにちは!これはHikkaです — 力強いモジュール式のTelegramユーザーボットです。"
  161. "あなたはそれをあなたのアカウントにインストールすることができます!</b>\n\n<b>🌍 <a"
  162. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  163. ' href="https://t.me/hikka_talks">サポートチャット</a></b>'
  164. ),
  165. }
  166. strings_kr = {
  167. "bot_username_invalid": (
  168. "<emoji document_id=5415905755406539934>🚫</emoji> <b>봇 사용자 이름이"
  169. " 잘못되었습니다. 그것은 </b><code>bot</code><b>으로 끝나야하며 최소 4자여야합니다</b>"
  170. ),
  171. "bot_username_occupied": (
  172. "<emoji document_id=5415905755406539934>🚫</emoji> <b>이 사용자 이름은"
  173. " 이미 사용 중입니다</b>"
  174. ),
  175. "bot_updated": (
  176. "<emoji document_id=6318792204118656433>🎉</emoji> <b>설정이 성공적으로"
  177. " 저장되었습니다. 이러한 변경 사항을 적용하려면 봇을 다시 시작하십시오</b>"
  178. ),
  179. "this_is_hikka": (
  180. "🌘 <b>안녕하세요! 이것은 Hikka입니다 — 강력하고 모듈식인 Telegram 사용자 봇입니다."
  181. "당신은 그것을 당신의 계정에 설치할 수 있습니다!</b>\n\n<b>🌍 <a"
  182. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  183. ' href="https://t.me/hikka_talks">지원 채팅</a></b>'
  184. ),
  185. }
  186. strings_ar = {
  187. "bot_username_invalid": (
  188. "<emoji document_id=5415905755406539934>🚫</emoji> <b>اسم مستخدم البوت"
  189. " غير صالح. يجب أن ينتهي بـ </b><code>bot</code><b> وأن يكون"
  190. " أكثر من 4 أحرف</b>"
  191. ),
  192. "bot_username_occupied": (
  193. "<emoji document_id=5415905755406539934>🚫</emoji> <b>اسم المستخدم مأخوذ"
  194. " بالفعل</b>"
  195. ),
  196. "bot_updated": (
  197. "<emoji document_id=6318792204118656433>🎉</emoji> <b>تم حفظ الإعدادات"
  198. " بنجاح. يرجى إعادة تشغيل البوت لتطبيق التغييرات</b>"
  199. ),
  200. "this_is_hikka": (
  201. "🌘 <b>مرحبًا! هذا هو Hikka - مستخدم بوت تيليغرام قوي وموديولي. يمكنك تثبيته"
  202. " على حسابك!</b>\n\n<b>🌍 <a"
  203. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  204. ' href="https://t.me/hikka_talks">دردشة الدعم</a></b>'
  205. ),
  206. }
  207. strings_es = {
  208. "bot_username_invalid": (
  209. "<emoji document_id=5415905755406539934>🚫</emoji> <b>El nombre de usuario"
  210. " del bot no es válido. Debe terminar con </b><code>bot</code><b> y"
  211. " tener al menos 4 caracteres</b>"
  212. ),
  213. "bot_username_occupied": (
  214. "<emoji document_id=5415905755406539934>🚫</emoji> <b>El nombre de usuario"
  215. " ya está en uso</b>"
  216. ),
  217. "bot_updated": (
  218. "<emoji document_id=6318792204118656433>🎉</emoji> <b>La configuración se"
  219. " guardó correctamente. Reinicie el bot para aplicar los cambios</b>"
  220. ),
  221. "this_is_hikka": (
  222. "🌘 <b>¡Hola! Este es Hikka - un poderoso bot de usuario modular de"
  223. " Telegram. ¡Puedes instalarlo en tu cuenta!</b>\n\n<b>🌍 <a"
  224. ' href="https://github.com/hikariaitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  225. ' href="https://t.me/hikka_talks">Chat de soporte</a></b>'
  226. ),
  227. }
  228. async def watcher(self, message: Message):
  229. if (
  230. getattr(message, "out", False)
  231. and getattr(message, "via_bot_id", False)
  232. and message.via_bot_id == self.inline.bot_id
  233. and "This message will be deleted automatically"
  234. in getattr(message, "raw_text", "")
  235. ):
  236. await message.delete()
  237. return
  238. if (
  239. not getattr(message, "out", False)
  240. or not getattr(message, "via_bot_id", False)
  241. or message.via_bot_id != self.inline.bot_id
  242. or "Opening gallery..." not in getattr(message, "raw_text", "")
  243. ):
  244. return
  245. id_ = re.search(r"#id: ([a-zA-Z0-9]+)", message.raw_text)[1]
  246. await message.delete()
  247. m = await message.respond("🌘")
  248. await self.inline.gallery(
  249. message=m,
  250. next_handler=self.inline._custom_map[id_]["handler"],
  251. caption=self.inline._custom_map[id_].get("caption", ""),
  252. force_me=self.inline._custom_map[id_].get("force_me", False),
  253. disable_security=self.inline._custom_map[id_].get(
  254. "disable_security", False
  255. ),
  256. silent=True,
  257. )
  258. async def _check_bot(self, username: str) -> bool:
  259. async with self._client.conversation("@BotFather", exclusive=False) as conv:
  260. try:
  261. m = await conv.send_message("/token")
  262. except YouBlockedUserError:
  263. await self._client(UnblockRequest(id="@BotFather"))
  264. m = await conv.send_message("/token")
  265. r = await conv.get_response()
  266. await m.delete()
  267. await r.delete()
  268. if not hasattr(r, "reply_markup") or not hasattr(r.reply_markup, "rows"):
  269. return False
  270. for row in r.reply_markup.rows:
  271. for button in row.buttons:
  272. if username != button.text.strip("@"):
  273. continue
  274. m = await conv.send_message("/cancel")
  275. r = await conv.get_response()
  276. await m.delete()
  277. await r.delete()
  278. return True
  279. @loader.command(
  280. ru_doc="<юзернейм> - Изменить юзернейм инлайн бота",
  281. de_doc="<username> - Ändere den Inline-Bot-Nutzernamen",
  282. tr_doc="<kullanıcı adı> - İçe aktarma botunun kullanıcı adını değiştirin",
  283. hi_doc="<उपयोगकर्ता नाम> - इनलाइन बॉट का उपयोगकर्ता नाम बदलें",
  284. uz_doc="<foydalanuvchi nomi> - Bot foydalanuvchi nomini o'zgartiring",
  285. ja_doc="<ユーザー名> - インラインボットのユーザー名を変更します",
  286. kr_doc="<사용자 이름> - 인라인 봇의 사용자 이름을 변경합니다",
  287. ar_doc="<اسم المستخدم> - تغيير اسم المستخدم للبوت الداخلي",
  288. es_doc="<nombre de usuario> - Cambia el nombre de usuario del bot de inline",
  289. )
  290. async def ch_hikka_bot(self, message: Message):
  291. """<username> - Change your Hikka inline bot username"""
  292. args = utils.get_args_raw(message).strip("@")
  293. if (
  294. not args
  295. or not args.lower().endswith("bot")
  296. or len(args) <= 4
  297. or any(
  298. litera not in (string.ascii_letters + string.digits + "_")
  299. for litera in args
  300. )
  301. ):
  302. await utils.answer(message, self.strings("bot_username_invalid"))
  303. return
  304. try:
  305. await self._client.get_entity(f"@{args}")
  306. except ValueError:
  307. pass
  308. else:
  309. if not await self._check_bot(args):
  310. await utils.answer(message, self.strings("bot_username_occupied"))
  311. return
  312. self._db.set("hikka.inline", "custom_bot", args)
  313. self._db.set("hikka.inline", "bot_token", None)
  314. await utils.answer(message, self.strings("bot_updated"))
  315. async def aiogram_watcher(self, message: BotInlineMessage):
  316. if message.text != "/start":
  317. return
  318. await message.answer_photo(
  319. "https://github.com/hikariatama/assets/raw/master/hikka_banner.png",
  320. caption=self.strings("this_is_hikka"),
  321. )
  322. async def client_ready(self):
  323. if self.get("migrated"):
  324. return
  325. self.set("migrated", True)
  326. async with self._client.conversation("@BotFather") as conv:
  327. for msg in [
  328. "/cancel",
  329. "/setinline",
  330. f"@{self.inline.bot_username}",
  331. "user@hikka:~$",
  332. ]:
  333. m = await conv.send_message(msg)
  334. r = await conv.get_response()
  335. await m.delete()
  336. await r.delete()