inline_stuff.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. # ©️ Dan Gazizullin, 2021-2023
  2. # This file is a part of Hikka Userbot
  3. # 🌐 https://github.com/hikariatama/Hikka
  4. # You can redistribute it and/or modify it under the terms of the GNU AGPLv3
  5. # 🔑 https://www.gnu.org/licenses/agpl-3.0.html
  6. import re
  7. import string
  8. from telethon.errors.rpcerrorlist import YouBlockedUserError
  9. from telethon.tl.functions.contacts import UnblockRequest
  10. from telethon.tl.types import Message
  11. from .. import loader, utils
  12. from ..inline.types import BotInlineMessage
  13. @loader.tds
  14. class InlineStuffMod(loader.Module):
  15. """Provides support for inline stuff"""
  16. strings = {
  17. "name": "InlineStuff",
  18. "bot_username_invalid": (
  19. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Specified bot"
  20. " username is invalid. It must end with</b> <code>bot</code> <b>and contain"
  21. " at least 4 symbols</b>"
  22. ),
  23. "bot_username_occupied": (
  24. "<emoji document_id=5312526098750252863>🚫</emoji> <b>This username is"
  25. " already occupied</b>"
  26. ),
  27. "bot_updated": (
  28. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Config successfully"
  29. " saved. Restart userbot to apply changes</b>"
  30. ),
  31. "this_is_hikka": (
  32. "🌘 <b>Hi! This is Hikka — powerful modular Telegram userbot. You can"
  33. " install it to your account!</b>\n\n<b>🌍 <a"
  34. ' href="https://github.com/hikaraitama/Hikka">GitHub</a></b>\n<b>👥 <a'
  35. ' href="https://t.me/hikka_talks">Support chat</a></b>'
  36. ),
  37. }
  38. strings_ru = {
  39. "bot_username_invalid": (
  40. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Неправильный ник"
  41. " бота. Он должен заканчиваться на</b> <code>bot</code> <b>и быть не короче"
  42. " чем 5 символов</b>"
  43. ),
  44. "bot_username_occupied": (
  45. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Такой ник бота уже"
  46. " занят</b>"
  47. ),
  48. "bot_updated": (
  49. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Настройки сохранены."
  50. " Для их применения нужно перезагрузить юзербот</b>"
  51. ),
  52. "this_is_hikka": (
  53. "🌘 <b>Привет! Это Hikka — мощный модульный Telegram юзербот. Вы можете"
  54. " установить его на свой аккаунт!</b>\n\n<b>🌍 <a"
  55. ' href="https://github.com/hikariatama/Hikka">GitHub</a></b>\n<b>👥 <a'
  56. ' href="https://t.me/hikka_talks">Чат поддержки</a></b>'
  57. ),
  58. }
  59. strings_fr = {
  60. "bot_username_invalid": (
  61. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Nom d'utilisateur du"
  62. " bot incorrect. Il doit être de plus de 5 caractères et se terminer par"
  63. " </b> <code>bot</code>"
  64. ),
  65. "bot_username_occupied": (
  66. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Nom d'utilisateur du"
  67. " bot déjà occupé</b>"
  68. ),
  69. "bot_updated": (
  70. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Paramètres"
  71. " enregistrés. Redémarrez le bot pour les appliquer</b>"
  72. ),
  73. "this_is_hikka": (
  74. "🌘 <b>Bonjour! C'est Hikka — un puissant module Telegram userbot. Vous"
  75. " pouvez l'installer sur votre compte!</b>\n\n<b>🌍 <a"
  76. ' href="https://github.com/hikariatama/Hikka">GitHub</a></b>\n<b>👥 <a'
  77. ' href="https://t.me/hikka_talks">Chat de support</a></b>'
  78. ),
  79. }
  80. strings_it = {
  81. "bot_username_invalid": (
  82. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Il nome utente del"
  83. " bot non è valido. Deve terminare con</b> <code>bot</code> <b>e contenere"
  84. " almeno 4 caratteri</b>"
  85. ),
  86. "bot_username_occupied": (
  87. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Questo nome utente è"
  88. " già occupato</b>"
  89. ),
  90. "bot_updated": (
  91. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Le impostazioni sono"
  92. " state salvate. Riavvia il bot per applicare le modifiche</b>"
  93. ),
  94. "this_is_hikka": (
  95. "🌘 <b>Ciao! Questo è Hikka — potente userbot modulare per Telegram. Lo"
  96. " puoi installare sul tuo account!</b>\n\n<b>🌍 <a"
  97. ' href="https://github.com/hikariatama/Hikka">GitHub</a></b>\n<b>👥 <a'
  98. ' href="https://t.me/hikka_talks">Chat di supporto</a></b>'
  99. ),
  100. }
  101. strings_de = {
  102. "bot_username_invalid": (
  103. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Der angegebene"
  104. " Benutzername ist ungültig. Er muss mit</b> <code>bot</code> <b>enden und"
  105. " mindestens 4 Zeichen lang sein</b>"
  106. ),
  107. "bot_username_occupied": (
  108. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Dieser Benutzername"
  109. " ist bereits vergeben</b>"
  110. ),
  111. "bot_updated": (
  112. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Erfolgreich"
  113. " gespeichert. Starte den Userbot neu, um die Änderungen zu übernehmen</b>"
  114. ),
  115. "this_is_hikka": (
  116. "🌘 <b>Hallo! Das ist Hikka — mächtiger modulare Telegram Userbot. Du kannst"
  117. " ihn auf deinen Account installieren!</b>\n\n<b>🌍 <a"
  118. ' href="https://github.com/hikariatama/Hikka">GitHub</a></b>\n<b>👥 <a'
  119. ' href="https://t.me/hikka_talks">Support Chat</a></b>'
  120. ),
  121. }
  122. strings_tr = {
  123. "bot_username_invalid": (
  124. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Belirtilen bot"
  125. " kullanıcı adı geçersiz. Botun adı</b> <code>bot</code> <b>ile bitmeli ve"
  126. " en az 4 karakter içermelidir</b>"
  127. ),
  128. "bot_username_occupied": (
  129. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Bu kullanıcı adı"
  130. " zaten alınmış</b>"
  131. ),
  132. "bot_updated": (
  133. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Yapılandırma başarıyla"
  134. " kaydedildi. Değişiklikleri uygulamak için botu yeniden başlatın</b>"
  135. ),
  136. "this_is_hikka": (
  137. "🌘 <b>Merhaba! Bu Hikka — güçlü modüler Telegram kullanıcı botu. Hesabınıza"
  138. " kurup, kullanabilirsiniz!</b>\n\n<b>🌍 <a"
  139. ' href="https://github.com/hikariatama/Hikka">GitHub</a></b>\n<b>👥 <a'
  140. ' href="https://t.me/hikka_talks">Destek sohbeti</a></b>'
  141. ),
  142. }
  143. strings_uz = {
  144. "bot_username_invalid": (
  145. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Bot foydalanuvchi"
  146. " nomi noto'g'ri. U</b> <code>bot</code> <b>bilan tugashi kerak va kamida 4"
  147. " belgidan iborat bo'lishi kerak</b>"
  148. ),
  149. "bot_username_occupied": (
  150. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Ushbu foydalanuvchi"
  151. " nomi allaqachon band</b>"
  152. ),
  153. "bot_updated": (
  154. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Konfiguratsiya"
  155. " muvaffaqiyatli saqlandi. Ushbu o'zgarishlarni qo'llash uchun botni qayta"
  156. " ishga tushiring</b>"
  157. ),
  158. "this_is_hikka": (
  159. "🌘 <b>Salom! Bu Hikka - kuchli modulli Telegram userboti. Siz uni"
  160. " o'zingizni akkauntingizga o'rnatishingiz mumkin!</b>\n\n<b>🌍 <a"
  161. ' href="https://github.com/hikariatama/Hikka">GitHub</a></b>\n<b>👥 <a'
  162. ' href="https://t.me/hikka_talks">Yordam chati</a></b>'
  163. ),
  164. }
  165. strings_es = {
  166. "bot_username_invalid": (
  167. "<emoji document_id=5312526098750252863>🚫</emoji> <b>El nombre de usuario"
  168. " del bot no es válido. Debe terminar con</b> <code>bot</code> <b>y"
  169. " tener al menos 4 caracteres</b>"
  170. ),
  171. "bot_username_occupied": (
  172. "<emoji document_id=5312526098750252863>🚫</emoji> <b>El nombre de usuario"
  173. " ya está en uso</b>"
  174. ),
  175. "bot_updated": (
  176. "<emoji document_id=6318792204118656433>🎉</emoji> <b>La configuración se"
  177. " guardó correctamente. Reinicie el bot para aplicar los cambios</b>"
  178. ),
  179. "this_is_hikka": (
  180. "🌘 <b>¡Hola! Este es Hikka - un poderoso bot de usuario modular de"
  181. " Telegram. ¡Puedes instalarlo en tu cuenta!</b>\n\n<b>🌍 <a"
  182. ' href="https://github.com/hikariatama/Hikka">GitHub</a></b>\n<b>👥 <a'
  183. ' href="https://t.me/hikka_talks">Chat de soporte</a></b>'
  184. ),
  185. }
  186. strings_kk = {
  187. "name": "InlineStuff",
  188. "bot_username_invalid": (
  189. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Көрсетілген бот"
  190. " аты жарамсыз. Оның соңында</b> <code>bot</code> <b>қосып, 4 символдан"
  191. " кем болмауы керек</b>"
  192. ),
  193. "bot_username_occupied": (
  194. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Бұл ат бос емес</b>"
  195. ),
  196. "bot_updated": (
  197. "<emoji document_id=6318792204118656433>🎉</emoji> <b>Баптаулар сақталды."
  198. " Өзгертулерді қолдану үшін ботты қайта іске қосыңыз</b>"
  199. ),
  200. "this_is_hikka": (
  201. "🌘 <b>Сәлеметсіз бе! Бұл Hikka — жақсы модульді Telegram бот. Сіз"
  202. " онды аккаунтыңызға орната аласыз!</b>\n\n<b>🌍 <a"
  203. ' href="https://github.com/hikariatama/Hikka">GitHub</a></b>\n<b>👥 <a'
  204. ' href="https://t.me/hikka_talks">Қолдау сөйлесу кезегі</a></b>'
  205. ),
  206. }
  207. async def watcher(self, message: Message):
  208. if (
  209. getattr(message, "out", False)
  210. and getattr(message, "via_bot_id", False)
  211. and message.via_bot_id == self.inline.bot_id
  212. and "This message will be deleted automatically"
  213. in getattr(message, "raw_text", "")
  214. ):
  215. await message.delete()
  216. return
  217. if (
  218. not getattr(message, "out", False)
  219. or not getattr(message, "via_bot_id", False)
  220. or message.via_bot_id != self.inline.bot_id
  221. or "Opening gallery..." not in getattr(message, "raw_text", "")
  222. ):
  223. return
  224. id_ = re.search(r"#id: ([a-zA-Z0-9]+)", message.raw_text)[1]
  225. await message.delete()
  226. m = await message.respond("🌘", reply_to=utils.get_topic(message))
  227. await self.inline.gallery(
  228. message=m,
  229. next_handler=self.inline._custom_map[id_]["handler"],
  230. caption=self.inline._custom_map[id_].get("caption", ""),
  231. force_me=self.inline._custom_map[id_].get("force_me", False),
  232. disable_security=self.inline._custom_map[id_].get(
  233. "disable_security", False
  234. ),
  235. silent=True,
  236. )
  237. async def _check_bot(self, username: str) -> bool:
  238. async with self._client.conversation("@BotFather", exclusive=False) as conv:
  239. try:
  240. m = await conv.send_message("/token")
  241. except YouBlockedUserError:
  242. await self._client(UnblockRequest(id="@BotFather"))
  243. m = await conv.send_message("/token")
  244. r = await conv.get_response()
  245. await m.delete()
  246. await r.delete()
  247. if not hasattr(r, "reply_markup") or not hasattr(r.reply_markup, "rows"):
  248. return False
  249. for row in r.reply_markup.rows:
  250. for button in row.buttons:
  251. if username != button.text.strip("@"):
  252. continue
  253. m = await conv.send_message("/cancel")
  254. r = await conv.get_response()
  255. await m.delete()
  256. await r.delete()
  257. return True
  258. @loader.command(
  259. ru_doc="<юзернейм> - Изменить юзернейм инлайн бота",
  260. fr_doc="<nom d'utilisateur> - Changez le nom d'utilisateur de votre bot inline",
  261. it_doc="<username> - Cambia il nome utente del bot inline",
  262. de_doc="<username> - Ändere den Inline-Bot-Nutzernamen",
  263. tr_doc="<kullanıcı adı> - İçe aktarma botunun kullanıcı adını değiştirin",
  264. uz_doc="<foydalanuvchi nomi> - Bot foydalanuvchi nomini o'zgartiring",
  265. es_doc="<nombre de usuario> - Cambia el nombre de usuario del bot de inline",
  266. kk_doc="<пайдаланушы аты> - Инлайн боттың пайдаланушы атын өзгерту",
  267. )
  268. async def ch_hikka_bot(self, message: Message):
  269. """<username> - Change your Hikka inline bot username"""
  270. args = utils.get_args_raw(message).strip("@")
  271. if (
  272. not args
  273. or not args.lower().endswith("bot")
  274. or len(args) <= 4
  275. or any(
  276. litera not in (string.ascii_letters + string.digits + "_")
  277. for litera in args
  278. )
  279. ):
  280. await utils.answer(message, self.strings("bot_username_invalid"))
  281. return
  282. try:
  283. await self._client.get_entity(f"@{args}")
  284. except ValueError:
  285. pass
  286. else:
  287. if not await self._check_bot(args):
  288. await utils.answer(message, self.strings("bot_username_occupied"))
  289. return
  290. self._db.set("hikka.inline", "custom_bot", args)
  291. self._db.set("hikka.inline", "bot_token", None)
  292. await utils.answer(message, self.strings("bot_updated"))
  293. async def aiogram_watcher(self, message: BotInlineMessage):
  294. if message.text != "/start":
  295. return
  296. await message.answer_photo(
  297. "https://github.com/hikariatama/assets/raw/master/hikka_banner.png",
  298. caption=self.strings("this_is_hikka"),
  299. )
  300. async def client_ready(self):
  301. if self.get("migrated"):
  302. return
  303. self.set("migrated", True)
  304. async with self._client.conversation("@BotFather") as conv:
  305. for msg in [
  306. "/cancel",
  307. "/setinline",
  308. f"@{self.inline.bot_username}",
  309. "user@hikka:~$",
  310. ]:
  311. m = await conv.send_message(msg)
  312. r = await conv.get_response()
  313. await m.delete()
  314. await r.delete()