presets.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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 asyncio
  9. import logging
  10. from ..inline.types import InlineCall, BotInlineMessage
  11. from .. import loader, utils
  12. logger = logging.getLogger(__name__)
  13. PRESETS = {
  14. "fun": [
  15. "https://mods.hikariatama.ru/aniquotes.py",
  16. "https://mods.hikariatama.ru/artai.py",
  17. "https://mods.hikariatama.ru/inline_ghoul.py",
  18. "https://mods.hikariatama.ru/lovemagic.py",
  19. "https://mods.hikariatama.ru/mindgame.py",
  20. "https://mods.hikariatama.ru/moonlove.py",
  21. "https://mods.hikariatama.ru/neko.py",
  22. "https://mods.hikariatama.ru/purr.py",
  23. "https://mods.hikariatama.ru/rpmod.py",
  24. "https://mods.hikariatama.ru/scrolller.py",
  25. "https://mods.hikariatama.ru/tictactoe.py",
  26. "https://mods.hikariatama.ru/trashguy.py",
  27. "https://mods.hikariatama.ru/truth_or_dare.py",
  28. "https://mods.hikariatama.ru/sticks.py",
  29. "https://mods.hikariatama.ru/premium_sticks.py",
  30. "https://heta.hikariatama.ru/MoriSummerz/ftg-mods/magictext.py",
  31. "https://heta.hikariatama.ru/HitaloSama/FTG-modules-repo/quotes.py",
  32. "https://heta.hikariatama.ru/HitaloSama/FTG-modules-repo/spam.py",
  33. "https://heta.hikariatama.ru/SkillsAngels/Modules/IrisLab.py",
  34. "https://heta.hikariatama.ru/Fl1yd/FTG-Modules/arts.py",
  35. "https://heta.hikariatama.ru/SkillsAngels/Modules/Complements.py",
  36. "https://heta.hikariatama.ru/Den4ikSuperOstryyPer4ik/Astro-modules/Compliments.py",
  37. "https://heta.hikariatama.ru/vsecoder/hikka_modules/mazemod.py",
  38. ],
  39. "chat": [
  40. "https://mods.hikariatama.ru/activists.py",
  41. "https://mods.hikariatama.ru/banstickers.py",
  42. "https://mods.hikariatama.ru/hikarichat.py",
  43. "https://mods.hikariatama.ru/inactive.py",
  44. "https://mods.hikariatama.ru/keyword.py",
  45. "https://mods.hikariatama.ru/tagall.py",
  46. "https://mods.hikariatama.ru/voicechat.py",
  47. "https://mods.hikariatama.ru/vtt.py",
  48. "https://heta.hikariatama.ru/SekaiYoneya/Friendly-telegram/BanMedia.py",
  49. "https://heta.hikariatama.ru/iamnalinor/FTG-modules/swmute.py",
  50. "https://heta.hikariatama.ru/GeekTG/FTG-Modules/filter.py",
  51. ],
  52. "service": [
  53. "https://mods.hikariatama.ru/account_switcher.py",
  54. "https://mods.hikariatama.ru/surl.py",
  55. "https://mods.hikariatama.ru/httpsc.py",
  56. "https://mods.hikariatama.ru/img2pdf.py",
  57. "https://mods.hikariatama.ru/latex.py",
  58. "https://mods.hikariatama.ru/pollplot.py",
  59. "https://mods.hikariatama.ru/sticks.py",
  60. "https://mods.hikariatama.ru/temp_chat.py",
  61. "https://mods.hikariatama.ru/vtt.py",
  62. "https://heta.hikariatama.ru/vsecoder/hikka_modules/accounttime.py",
  63. "https://heta.hikariatama.ru/vsecoder/hikka_modules/searx.py",
  64. "https://heta.hikariatama.ru/iamnalinor/FTG-modules/swmute.py",
  65. ],
  66. "downloaders": [
  67. "https://mods.hikariatama.ru/musicdl.py",
  68. "https://mods.hikariatama.ru/uploader.py",
  69. "https://mods.hikariatama.ru/porn.py",
  70. "https://mods.hikariatama.ru/web2file.py",
  71. "https://heta.hikariatama.ru/AmoreForever/amoremods/instsave.py",
  72. "https://heta.hikariatama.ru/CakesTwix/Hikka-Modules/tikcock.py",
  73. "https://heta.hikariatama.ru/CakesTwix/Hikka-Modules/InlineYouTube.py",
  74. "https://heta.hikariatama.ru/CakesTwix/Hikka-Modules/InlineSpotifyDownloader.py",
  75. "https://heta.hikariatama.ru/GeekTG/FTG-Modules/downloader.py",
  76. "https://heta.hikariatama.ru/Den4ikSuperOstryyPer4ik/Astro-modules/dl_yt_previews.py",
  77. ],
  78. }
  79. @loader.tds
  80. class Presets(loader.Module):
  81. """Suggests new Hikka users a packs of modules to load"""
  82. strings = {
  83. "name": "Presets",
  84. "_fun_title": "🪩 Entertainment modules",
  85. "_fun_desc": "Fun modules — animations, spam, entertainment, etc.",
  86. "_chat_title": "👥 Group Administration Helpers",
  87. "_chat_desc": (
  88. "The collection of tools which will help to moderate your group chat —"
  89. " filters, notes, voice recognition, etc."
  90. ),
  91. "_service_title": "⚙️ Useful modules",
  92. "_service_desc": (
  93. "Really useful modules — account management, link shortener, search engine,"
  94. " etc."
  95. ),
  96. "_downloaders_title": "📥 Downloaders",
  97. "_downloaders_desc": (
  98. "The collection of tools which will help you download/upload files from/to"
  99. " different sources — YouTube, TikTok, Instagram, Spotify, VK Music, etc."
  100. ),
  101. "welcome": (
  102. "👋 <b>Hi there! Tired of scrolling through endless modules in channels? Let"
  103. " me suggest you some pre-made collections. If you need to call this menu"
  104. " again, simply send /presets to this bot!</b>"
  105. ),
  106. "preset": (
  107. "<b>{}:</b>\nℹ️ <i>{}</i>\n\n⚒ <b>Modules in this collection:</b>\n\n{}"
  108. ),
  109. "back": "🔙 Back",
  110. "install": "📦 Install",
  111. "installing": (
  112. "<emoji document_id=5451732530048802485>⏳</emoji> <b>Installing preset"
  113. " </b><code>{}</code><b>...</b>"
  114. ),
  115. "installing_module": (
  116. "<emoji document_id=5451732530048802485>⏳</emoji> <b>Installing preset"
  117. " </b><code>{}</code><b> ({}/{} modules)...</b>\n\n<emoji"
  118. " document_id=5188377234380954537>🌘</emoji> <i>Installing module"
  119. " {}...</i>"
  120. ),
  121. "installed": (
  122. "<emoji document_id=5436040291507247633>🎉</emoji> <b>Preset"
  123. " </b><code>{}</code><b> installed!</b>"
  124. ),
  125. "already_installed": "✅ [Installed]",
  126. }
  127. strings_ru = {
  128. "_fun_title": "🪩 Развлекательные модули",
  129. "_fun_desc": "Забавные модули — анимации, спам, игры, и др.",
  130. "_chat_title": "👥 Модули администрирования чата",
  131. "_chat_desc": (
  132. "Коллекция модулей, которые помогут вам администрировать чат — фильтры,"
  133. " заметки, распознавание речи, и др."
  134. ),
  135. "_service_title": "⚙️ Полезные модули",
  136. "_service_desc": (
  137. "Действительно полезные модули — управление аккаунтом, сократитель ссылок,"
  138. " поисковик, и др."
  139. ),
  140. "_downloaders_title": "📥 Загрузчики",
  141. "_downloaders_desc": (
  142. "Коллекция модулей, которые помогут вам загружать файлы в/из различных(-е)"
  143. " источников(-и) — YouTube, TikTok, Instagram, Spotify, VK Музыка, и др."
  144. ),
  145. "welcome": (
  146. "👋 <b>Привет! Устал листать бесчисленное количество модулей в каналах? Могу"
  147. " предложить тебе несколько готовых наборов. Если тебе понадобится повторно"
  148. " вызвать это меню, отправь мне команду /presets</b>"
  149. ),
  150. "preset": "<b>{}:</b>\nℹ️ <i>{}</i>\n\n⚒ <b>Модули в этом наборе:</b>\n\n{}",
  151. "back": "🔙 Назад",
  152. "install": "📦 Установить",
  153. "installing": (
  154. "<emoji document_id=5451732530048802485>⏳</emoji> <b>Установка набора"
  155. " >/b><code>{}</code><b>...</b>"
  156. ),
  157. "installing_module": (
  158. "<emoji document_id=5451732530048802485>⏳</emoji> <b>Установка набора"
  159. " </b><code>{}</code><b> ({}/{} модулей)...</b>\n\n<emoji"
  160. " document_id=5188377234380954537>🌘</emoji> <i>Установка модуля {}...</i>"
  161. ),
  162. "installed": (
  163. "<emoji document_id=5436040291507247633>🎉</emoji> <b>Набор"
  164. " </b><code>{}</code><b> установлен!</b>"
  165. ),
  166. "already_installed": "✅ [Установлен]",
  167. }
  168. async def client_ready(self):
  169. self._markup = utils.chunks(
  170. [
  171. {
  172. "text": self.strings(f"_{preset}_title"),
  173. "callback": self._preset,
  174. "args": (preset,),
  175. }
  176. for preset in PRESETS
  177. ],
  178. 1,
  179. )
  180. if self.get("sent"):
  181. return
  182. self.set("sent", True)
  183. await self._menu()
  184. async def _menu(self):
  185. await self.inline.bot.send_message(
  186. self._client.tg_id,
  187. self.strings("welcome"),
  188. reply_markup=self.inline.generate_markup(self._markup),
  189. )
  190. async def _back(self, call: InlineCall):
  191. await call.edit(self.strings("welcome"), reply_markup=self._markup)
  192. async def _install(self, call: InlineCall, preset: str):
  193. await call.delete()
  194. m = await self._client.send_message(
  195. self.inline.bot_id, self.strings("installing").format(preset)
  196. )
  197. for i, module in enumerate(PRESETS[preset]):
  198. await m.edit(
  199. self.strings("installing_module").format(
  200. preset, i, len(PRESETS[preset]), module
  201. )
  202. )
  203. try:
  204. await self.lookup("loader").download_and_install(module, None)
  205. except Exception:
  206. logger.exception("Failed to install module %s", module)
  207. await asyncio.sleep(1)
  208. if self.lookup("loader")._fully_loaded:
  209. self.lookup("loader")._update_modules_in_db()
  210. await m.edit(self.strings("installed").format(preset))
  211. await self._menu()
  212. def _is_installed(self, link: str) -> bool:
  213. return any(
  214. link.strip().lower() == installed.strip().lower()
  215. for installed in self.lookup("loader").get("loaded_modules", {}).values()
  216. )
  217. async def _preset(self, call: InlineCall, preset: str):
  218. await call.edit(
  219. self.strings("preset").format(
  220. self.strings(f"_{preset}_title"),
  221. self.strings(f"_{preset}_desc"),
  222. "\n".join(
  223. map(
  224. lambda x: x[0],
  225. sorted(
  226. [
  227. (
  228. "{} <b>{}</b>".format(
  229. (
  230. self.strings("already_installed")
  231. if self._is_installed(link)
  232. else "▫️"
  233. ),
  234. link.rsplit("/", maxsplit=1)[1].split(".")[0],
  235. ),
  236. int(self._is_installed(link)),
  237. )
  238. for link in PRESETS[preset]
  239. ],
  240. key=lambda x: x[1],
  241. reverse=True,
  242. ),
  243. )
  244. ),
  245. ),
  246. reply_markup=[
  247. {"text": self.strings("back"), "callback": self._back},
  248. {
  249. "text": self.strings("install"),
  250. "callback": self._install,
  251. "args": (preset,),
  252. },
  253. ],
  254. )
  255. async def aiogram_watcher(self, message: BotInlineMessage):
  256. if message.text != "/presets" or message.from_user.id != self._client.tg_id:
  257. return
  258. await self._menu()