help.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  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 difflib
  9. import inspect
  10. import logging
  11. from telethon.tl.types import Message
  12. from telethon.extensions.html import CUSTOM_EMOJIS
  13. from .. import loader, utils
  14. logger = logging.getLogger(__name__)
  15. @loader.tds
  16. class HelpMod(loader.Module):
  17. """Shows help for modules and commands"""
  18. strings = {
  19. "name": "Help",
  20. "bad_module": "<b>🚫 <b>Module</b> <code>{}</code> <b>not found</b>",
  21. "single_mod_header": (
  22. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  23. ),
  24. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  25. "undoc_cmd": "🦥 No docs",
  26. "all_header": (
  27. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} mods available,"
  28. " {} hidden:</b>"
  29. ),
  30. "mod_tmpl": "\n{} <code>{}</code>",
  31. "first_cmd_tmpl": ": ( {}",
  32. "cmd_tmpl": " | {}",
  33. "no_mod": "🚫 <b>Specify module to hide</b>",
  34. "hidden_shown": (
  35. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} modules hidden,"
  36. " {} modules shown:</b>\n{}\n{}"
  37. ),
  38. "ihandler": "\n🎹 <code>{}</code> {}",
  39. "undoc_ihandler": "🦥 No docs",
  40. "support": (
  41. "{} <b>Link to </b><a href='https://t.me/hikka_talks'>support chat</a></b>"
  42. ),
  43. "partial_load": (
  44. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Userbot is not"
  45. " fully loaded, so not all modules are shown</b>"
  46. ),
  47. "not_exact": (
  48. "<emoji document_id=5472105307985419058>☝️</emoji> <b>No exact match"
  49. " occured, so the closest result is shown instead</b>"
  50. ),
  51. "request_join": "You requested link for Hikka support chat",
  52. "core_notice": (
  53. "<emoji document_id=5472105307985419058>☝️</emoji> <b>This is a core"
  54. " module. You can't unload it nor replace</b>"
  55. ),
  56. }
  57. strings_ru = {
  58. "bad_module": "<b>🚫 <b>Модуль</b> <code>{}</code> <b>не найден</b>",
  59. "single_mod_header": (
  60. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  61. ),
  62. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  63. "undoc_cmd": "🦥 Нет описания",
  64. "all_header": (
  65. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} модулей доступно,"
  66. " {} скрыто:</b>"
  67. ),
  68. "mod_tmpl": "\n{} <code>{}</code>",
  69. "first_cmd_tmpl": ": ( {}",
  70. "cmd_tmpl": " | {}",
  71. "no_mod": "🚫 <b>Укажи модуль(-и), которые нужно скрыть</b>",
  72. "hidden_shown": (
  73. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} модулей скрыто,"
  74. " {} модулей показано:</b>\n{}\n{}"
  75. ),
  76. "ihandler": "\n🎹 <code>{}</code> {}",
  77. "undoc_ihandler": "🦥 Нет описания",
  78. "support": (
  79. "{} <b>Ссылка на </b><a href='https://t.me/hikka_talks'>чат помощи</a></b>"
  80. ),
  81. "_cls_doc": "Показывает помощь по модулям",
  82. "partial_load": (
  83. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Юзербот еще не"
  84. " загрузился полностью, поэтому показаны не все модули</b>"
  85. ),
  86. "not_exact": (
  87. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Точного совпадения"
  88. " не нашлось, поэтому было выбрано наиболее подходящее</b>"
  89. ),
  90. "request_join": "Вы запросили ссылку на чат помощи Hikka",
  91. "core_notice": (
  92. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Это встроенный"
  93. " модуль. Вы не можете его выгрузить или заменить</b>"
  94. ),
  95. }
  96. strings_de = {
  97. "bad_module": "<b>🚫 <b>Modul</b> <code>{}</code> <b>nicht gefunden</b>",
  98. "single_mod_header": (
  99. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  100. ),
  101. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  102. "undoc_cmd": "🦥 Keine Dokumentation",
  103. "all_header": (
  104. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} Module verfügbar,"
  105. " {} versteckt:</b>"
  106. ),
  107. "mod_tmpl": "\n{} <code>{}</code>",
  108. "first_cmd_tmpl": ": ( {}",
  109. "cmd_tmpl": " | {}",
  110. "no_mod": "🚫 <b>Gib das Modul an, das du verstecken willst</b>",
  111. "hidden_shown": (
  112. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} Module versteckt,"
  113. " {} Module angezeigt:</b>\n{}\n{}"
  114. ),
  115. "ihandler": "\n🎹 <code>{}</code> {}",
  116. "undoc_ihandler": "🦥 Keine Dokumentation",
  117. "support": (
  118. "{} <b>Link zum </b><a href='https://t.me/hikka_talks'>Supportchat</a></b>"
  119. ),
  120. "_cls_doc": "Zeigt Hilfe zu Modulen an",
  121. "partial_load": (
  122. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Der Userbot ist noch"
  123. " nicht vollständig geladen, daher werden nicht alle Module angezeigt</b>"
  124. ),
  125. "not_exact": (
  126. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Es wurde kein exakter"
  127. " Treffer gefunden, daher wird das nächstbeste Ergebnis angezeigt</b>"
  128. ),
  129. "request_join": "Du hast den Link zum Supportchat angefordert",
  130. "core_notice": (
  131. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Dies ist ein"
  132. " eingebauter Modul. Du kannst ihn nicht entladen oder ersetzen</b>"
  133. ),
  134. }
  135. strings_tr = {
  136. "bad_module": "<b>🚫 <b>Modül</b> <code>{}</code> <b>bulunamadı</b>",
  137. "single_mod_header": (
  138. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  139. ),
  140. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  141. "undoc_cmd": "🦥 Dokümantasyon yok",
  142. "all_header": (
  143. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} adet modül mevcut,"
  144. " {} gizli:</b>"
  145. ),
  146. "mod_tmpl": "\n{} <code>{}</code>",
  147. "first_cmd_tmpl": ": ( {}",
  148. "cmd_tmpl": " | {}",
  149. "no_mod": "🚫 <b>Gizlemek istediğin modülü belirt</b>",
  150. "hidden_shown": (
  151. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} adet modül"
  152. " gizlendi, {} adet modül gösterildi:</b>\n{}\n{}"
  153. ),
  154. "ihandler": "\n🎹 <code>{}</code> {}",
  155. "undoc_ihandler": "🦥 Dokümantasyon yok",
  156. "support": "{} <b><a href='https://t.me/hikka_talks'>Destek sohbeti</a></b>",
  157. "_cls_doc": "Modül yardımını gösterir",
  158. "partial_load": (
  159. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Kullanıcı botu"
  160. " henüz tam olarak yüklenmediğinden, tüm modüller görüntülenmez</b>"
  161. ),
  162. "not_exact": (
  163. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Herhangi bir"
  164. " eşleşme bulunamadığından, en uygun sonuç gösterildi</b>"
  165. ),
  166. "request_join": "Hikka Destek sohbetinin davet bağlantısını istediniz",
  167. "core_notice": (
  168. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Bu dahili"
  169. " b,r modül. Bu modülü kaldıramaz veya değiştiremezsin</b>"
  170. ),
  171. }
  172. strings_hi = {
  173. "bad_module": "<b>🚫 <b>मॉड्यूल</b> <code>{}</code> <b>नहीं मिला</b>",
  174. "single_mod_header": (
  175. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  176. ),
  177. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  178. "undoc_cmd": "🦥 दस्तावेज़ीकरण नहीं",
  179. "all_header": (
  180. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} मॉड्यूल उपलब्ध हैं,"
  181. " {} छिपा हुआ:</b>"
  182. ),
  183. "mod_tmpl": "\n{} <code>{}</code>",
  184. "first_cmd_tmpl": ": ( {}",
  185. "cmd_tmpl": " | {}",
  186. "no_mod": "🚫 <b>छिपाने के लिए मॉड्यूल दर्ज करें</b>",
  187. "hidden_shown": (
  188. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} मॉड्यूल छिपा हुआ,"
  189. " {} मॉड्यूल दिखाया गया:</b>\n{}\n{}"
  190. ),
  191. "ihandler": "\n🎹 <code>{}</code> {}",
  192. "undoc_ihandler": "🦥 दस्तावेज़ीकरण नहीं",
  193. "support": "{} <b><a href='https://t.me/hikka_talks'>सपोर्ट चैट</a></b>",
  194. "_cls_doc": "मॉड्यूल सहायता दिखाता है",
  195. "partial_load": (
  196. "<emoji document_id=5472105307985419058>☝️</emoji> <b>उपयोगकर्ता बॉट अभी भी"
  197. " पूरी तरह से लोड नहीं हुई है, इसलिए सभी मॉड्यूल दिखाई नहीं देते हैं</b>"
  198. ),
  199. "not_exact": (
  200. "<emoji document_id=5472105307985419058>☝️</emoji> <b>कोई मैच नहीं मिला,"
  201. " इसलिए सबसे अनुकूल परिणाम दिखाया गया है</b>"
  202. ),
  203. "request_join": "आपने सपोर्ट चैट लिंक का अनुरोध किया है",
  204. "core_notice": (
  205. "<emoji document_id=5472105307985419058>☝️</emoji> <b>यह एक अंतर्निहित"
  206. " मॉड्यूल है, आप इसे नहीं अटक सकते या बदल सकते हैं</b>"
  207. ),
  208. }
  209. strings_uz = {
  210. "bad_module": "<b>🚫 <b>Modul</b> <code>{}</code> <b>topilmadi</b>",
  211. "single_mod_header": (
  212. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  213. ),
  214. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  215. "undoc_cmd": "🦥 Hujjatlanmagan",
  216. "all_header": (
  217. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} Umumiy modullar,"
  218. " yashirin {}:</b>"
  219. ),
  220. "mod_tmpl": "\n{} <code>{}</code>",
  221. "first_cmd_tmpl": ": ( {}",
  222. "cmd_tmpl": " | {}",
  223. "no_mod": "🚫 <b>Yashirish uchun modul kiriting</b>",
  224. "hidden_shown": (
  225. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} yashirin,"
  226. " {} modullar ko'rsatilgan:</b>\n{}\n{}"
  227. ),
  228. "ihandler": "\n🎹 <code>{}</code> {}",
  229. "undoc_ihandler": "🦥 Hujjatlanmagan",
  230. "support": "{} <b><a href='https://t.me/hikka_talks'>Yordam chat</a></b>",
  231. "_cls_doc": "Modul yordamini ko'rsatadi",
  232. "partial_load": (
  233. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Foydalanuvchi boti"
  234. " hali to'liq yuklanmaganligi sababli, barcha modullar ko'rsatilmaydi</b>"
  235. ),
  236. "not_exact": (
  237. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Hech qanday moslik"
  238. " topilmadi, shuning uchun eng mos natija ko'rsatildi</b>"
  239. ),
  240. "request_join": "Siz yordam chat havolasini so'radingiz",
  241. "core_notice": (
  242. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Bu bir qo'shimcha"
  243. " modul, uni o'chirib yoki o'zgartirib bo'lmaysiz</b>"
  244. ),
  245. }
  246. strings_ja = {
  247. "bad_module": "<b>🚫 <b>モジュール</b> <code>{}</code> <b>見つかりませんでした</b>",
  248. "single_mod_header": (
  249. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  250. ),
  251. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  252. "undoc_cmd": "🦥 ドキュメント化されていません",
  253. "all_header": (
  254. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} モジュールの総数,"
  255. " 隠された {}:</b>"
  256. ),
  257. "mod_tmpl": "\n{} <code>{}</code>",
  258. "first_cmd_tmpl": ": ( {}",
  259. "cmd_tmpl": " | {}",
  260. "no_mod": "🚫 <b>隠すモジュールを入力してください</b>",
  261. "hidden_shown": (
  262. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} 隠された,"
  263. " {} モジュールが表示されました:</b>\n{}\n{}"
  264. ),
  265. "ihandler": "\n🎹 <code>{}</code> {}",
  266. "undoc_ihandler": "🦥 ドキュメント化されていません",
  267. "support": "{} <b><a href='https://t.me/hikka_talks'>サポートチャット</a></b>",
  268. "_cls_doc": "モジュールのヘルプを表示します",
  269. "partial_load": (
  270. "<emoji document_id=5472105307985419058>☝️</emoji> <b>ユーザーボットはまだ完全に"
  271. "読み込まれていないため、すべてのモジュールが表示されません</b>"
  272. ),
  273. "not_exact": (
  274. "<emoji document_id=5472105307985419058>☝️</emoji> <b>一致するものが見つかりませんでした。"
  275. "したがって、最も一致する結果が表示されました</b>"
  276. ),
  277. "request_join": "サポートチャットへのリンクをリクエストしました",
  278. "core_notice": (
  279. "<emoji document_id=5472105307985419058>☝️</emoji> <b>これは追加モジュールであり、"
  280. "削除または変更できません</b>"
  281. ),
  282. }
  283. strings_kr = {
  284. "bad_module": "<b>🚫 <b>모듈</b> <code>{}</code> <b>찾을 수 없습니다</b>",
  285. "single_mod_header": (
  286. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  287. ),
  288. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  289. "undoc_cmd": "🦥 문서화되지 않음",
  290. "all_header": (
  291. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} 총 모듈, 숨겨진 {}:</b>"
  292. ),
  293. "mod_tmpl": "\n{} <code>{}</code>",
  294. "first_cmd_tmpl": ": ( {}",
  295. "cmd_tmpl": " | {}",
  296. "no_mod": "🚫 <b>숨기려는 모듈을 입력하십시오</b>",
  297. "hidden_shown": (
  298. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} 숨겨진,"
  299. " {} 모듈이 표시되었습니다:</b>\n{}\n{}"
  300. ),
  301. "ihandler": "\n🎹 <code>{}</code> {}",
  302. "undoc_ihandler": "🦥 문서화되지 않음",
  303. "support": "{} <b><a href='https://t.me/hikka_talks'>지원 채팅</a></b>",
  304. "_cls_doc": "모듈 도움말을 표시합니다",
  305. "partial_load": (
  306. "<emoji document_id=5472105307985419058>☝️</emoji> <b>사용자 봇이 아직 완전히"
  307. "로드되지 않았으므로 모든 모듈이 표시되지 않습니다</b>"
  308. ),
  309. "not_exact": (
  310. "<emoji document_id=5472105307985419058>☝️</emoji> <b>일치하는 것이 없으므로"
  311. "가장 일치하는 결과가 표시됩니다</b>"
  312. ),
  313. "request_join": "지원 채팅 링크를 요청했습니다",
  314. "core_notice": (
  315. "<emoji document_id=5472105307985419058>☝️</emoji> <b>이것은 추가 모듈이므로"
  316. "삭제 또는 변경할 수 없습니다</b>"
  317. ),
  318. }
  319. strings_ar = {
  320. "bad_module": "<b>🚫 <b>الموديول</b> <code>{}</code> <b>غير موجود</b>",
  321. "single_mod_header": (
  322. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  323. ),
  324. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  325. "undoc_cmd": "🦥 لم يتم توثيقه",
  326. "all_header": (
  327. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} موديولات,"
  328. " {} مخفية:</b>"
  329. ),
  330. "mod_tmpl": "\n{} <code>{}</code>",
  331. "first_cmd_tmpl": ": ( {}",
  332. "cmd_tmpl": " | {}",
  333. "no_mod": "🚫 <b>من فضلك قم بإدخال الموديول المراد إخفائه</b>",
  334. "hidden_shown": (
  335. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} مخفية,"
  336. " {} الموديولات المعروضة:</b>\n{}\n{}"
  337. ),
  338. "ihandler": "\n🎹 <code>{}</code> {}",
  339. "undoc_ihandler": "🦥 لم يتم توثيقه",
  340. "support": "{} <b><a href='https://t.me/hikka_talks'>دردشة الدعم</a></b>",
  341. "_cls_doc": "عرض مساعدة الموديول",
  342. "partial_load": (
  343. "<emoji document_id=5472105307985419058>☝️</emoji> <b>لم يتم تحميل البوت"
  344. " بعد بالكامل, لذلك لا يمكن عرض جميع الموديولات</b>"
  345. ),
  346. "not_exact": (
  347. "<emoji document_id=5472105307985419058>☝️</emoji> <b>لم يتم العثور على"
  348. " نتائج مطابقة, لذلك يتم عرض النتائج الأكثر تطابقا</b>"
  349. ),
  350. "request_join": "تم طلب رابط دردشة الدعم",
  351. "core_notice": (
  352. "<emoji document_id=5472105307985419058>☝️</emoji> <b>هذا موديول إضافي لذلك"
  353. " لا يمكنكحذفه أو تعديله</b>"
  354. ),
  355. }
  356. strings_es = {
  357. "bad_module": "<b>🚫 <b>El módulo</b> <code>{}</code> <b>no existe</b>",
  358. "single_mod_header": (
  359. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{}</b>:"
  360. ),
  361. "single_cmd": "\n▫️ <code>{}{}</code> {}",
  362. "undoc_cmd": "🦥 Sin documentar",
  363. "all_header": (
  364. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} módulos,"
  365. " {} ocultos:</b>"
  366. ),
  367. "mod_tmpl": "\n{} <code>{}</code>",
  368. "first_cmd_tmpl": ": ( {}",
  369. "cmd_tmpl": " | {}",
  370. "no_mod": "🚫 <b>Por favor, introduce el módulo que deseas ocultar</b>",
  371. "hidden_shown": (
  372. "<emoji document_id=5188377234380954537>🌘</emoji> <b>{} ocultos,"
  373. " {} módulos mostrados:</b>\n{}\n{}"
  374. ),
  375. "ihandler": "\n🎹 <code>{}</code> {}",
  376. "undoc_ihandler": "🦥 Sin documentar",
  377. "support": "{} <b><a href='https://t.me/hikka_talks'>Chat de soporte</a></b>",
  378. "_cls_doc": "Muestra la ayuda del módulo",
  379. "partial_load": (
  380. "<emoji document_id=5472105307985419058>☝️</emoji> <b>El bot no se ha"
  381. " cargado por completoaún, por lo que no se muestran todos los módulos</b>"
  382. ),
  383. "not_exact": (
  384. "<emoji document_id=5472105307985419058>☝️</emoji> <b>No se encontraron"
  385. " resultados exactos, por lo que se muestran los resultados más"
  386. " relevantes</b>"
  387. ),
  388. "request_join": "Se ha solicitado el enlace al chat de soporte",
  389. "core_notice": (
  390. "<emoji document_id=5472105307985419058>☝️</emoji> <b>Este es un módulo"
  391. " adicional, por loque no se puede eliminar o modificar</b>"
  392. ),
  393. }
  394. def __init__(self):
  395. self.config = loader.ModuleConfig(
  396. loader.ConfigValue(
  397. "core_emoji",
  398. "▪️",
  399. lambda: "Core module bullet",
  400. validator=loader.validators.Emoji(length=1),
  401. ),
  402. loader.ConfigValue(
  403. "hikka_emoji",
  404. "🌘",
  405. lambda: "Hikka-only module bullet",
  406. validator=loader.validators.Emoji(length=1),
  407. ),
  408. loader.ConfigValue(
  409. "plain_emoji",
  410. "▫️",
  411. lambda: "Plain module bullet",
  412. validator=loader.validators.Emoji(length=1),
  413. ),
  414. loader.ConfigValue(
  415. "empty_emoji",
  416. "🙈",
  417. lambda: "Empty modules bullet",
  418. validator=loader.validators.Emoji(length=1),
  419. ),
  420. )
  421. @loader.command(
  422. ru_doc=(
  423. "<модуль или модули> - Спрятать модуль(-и) из помощи\n*Разделяй модули"
  424. " пробелами"
  425. ),
  426. de_doc=(
  427. "<Modul oder Module> - Verstecke Modul(-e) aus der Hilfe\n*Modulnamen"
  428. " mit Leerzeichen trennen"
  429. ),
  430. tr_doc=(
  431. "<modül veya modüller> - Yardımdan modül(-ler) gizle\n*Modülleri boşluk"
  432. " ile ayır"
  433. ),
  434. uz_doc=(
  435. "<modul yoki modullar> - Modul(-lar) yordamidan yashirish\n*Modullarni"
  436. " bo'sh joy bilan ajratish"
  437. ),
  438. hi_doc=(
  439. "<मॉड्यूल या मॉड्यूल्स> - मॉड्यूल(-स) को छिपाएँ\n*मॉड्यूल को अलग करने के"
  440. " लिए रिक्त स्थान बनाएँ"
  441. ),
  442. ja_doc="<モジュールまたはモジュール> - ヘルプからモジュールを隠します\n*モジュールをスペースで区切ってください",
  443. kr_doc="<모듈 또는 모듈> - 도움말에서 모듈을 숨깁니다\n*모듈을 공백으로 구분하십시오",
  444. ar_doc="<الوحدة أو الوحدات> - إخفاء وحدة(-ات) من المساعدة\n*فصل الوحدات بفراغ",
  445. es_doc=(
  446. "<módulo o módulos> - Oculta el módulo (-s) de la ayuda\n*Separa los"
  447. " módulos con espacios"
  448. ),
  449. )
  450. async def helphide(self, message: Message):
  451. """<module or modules> - Hide module(-s) from help
  452. *Split modules by spaces"""
  453. modules = utils.get_args(message)
  454. if not modules:
  455. await utils.answer(message, self.strings("no_mod"))
  456. return
  457. mods = [i.__class__.__name__ for i in self.allmodules.modules]
  458. modules = list(filter(lambda module: module in mods, modules))
  459. currently_hidden = self.get("hide", [])
  460. hidden, shown = [], []
  461. for module in modules:
  462. if module in currently_hidden:
  463. currently_hidden.remove(module)
  464. shown += [module]
  465. else:
  466. currently_hidden += [module]
  467. hidden += [module]
  468. self.set("hide", currently_hidden)
  469. await utils.answer(
  470. message,
  471. self.strings("hidden_shown").format(
  472. len(hidden),
  473. len(shown),
  474. "\n".join([f"👁‍🗨 <i>{m}</i>" for m in hidden]),
  475. "\n".join([f"👁 <i>{m}</i>" for m in shown]),
  476. ),
  477. )
  478. async def modhelp(self, message: Message, args: str):
  479. exact = True
  480. module = self.lookup(args)
  481. if not module:
  482. _args = args.lower()
  483. _args = _args[1:] if _args.startswith(self.get_prefix()) else _args
  484. if _args in self.allmodules.commands:
  485. module = self.allmodules.commands[_args].__self__
  486. if not module:
  487. module = self.lookup(
  488. next(
  489. (
  490. reversed(
  491. sorted(
  492. [
  493. module.strings["name"]
  494. for module in self.allmodules.modules
  495. ],
  496. key=lambda x: difflib.SequenceMatcher(
  497. None,
  498. args.lower(),
  499. x,
  500. ).ratio(),
  501. )
  502. )
  503. ),
  504. None,
  505. )
  506. )
  507. exact = False
  508. try:
  509. name = module.strings("name")
  510. except KeyError:
  511. name = getattr(module, "name", "ERROR")
  512. _name = (
  513. "{} (v{}.{}.{})".format(
  514. utils.escape_html(name),
  515. module.__version__[0],
  516. module.__version__[1],
  517. module.__version__[2],
  518. )
  519. if hasattr(module, "__version__")
  520. else utils.escape_html(name)
  521. )
  522. reply = self.strings("single_mod_header").format(_name)
  523. if module.__doc__:
  524. reply += "<i>\nℹ️ " + utils.escape_html(inspect.getdoc(module)) + "\n</i>"
  525. commands = {
  526. name: func
  527. for name, func in module.commands.items()
  528. if await self.allmodules.check_security(message, func)
  529. }
  530. if hasattr(module, "inline_handlers"):
  531. for name, fun in module.inline_handlers.items():
  532. reply += self.strings("ihandler").format(
  533. f"@{self.inline.bot_username} {name}",
  534. (
  535. utils.escape_html(inspect.getdoc(fun))
  536. if fun.__doc__
  537. else self.strings("undoc_ihandler")
  538. ),
  539. )
  540. for name, fun in commands.items():
  541. reply += self.strings("single_cmd").format(
  542. self.get_prefix(),
  543. name,
  544. (
  545. utils.escape_html(inspect.getdoc(fun))
  546. if fun.__doc__
  547. else self.strings("undoc_cmd")
  548. ),
  549. )
  550. await utils.answer(
  551. message,
  552. reply
  553. + (f"\n\n{self.strings('not_exact')}" if not exact else "")
  554. + (
  555. f"\n\n{self.strings('core_notice')}"
  556. if module.__origin__.startswith("<core")
  557. else ""
  558. ),
  559. )
  560. @loader.unrestricted
  561. @loader.command(
  562. ru_doc="[модуль] [-f] - Показать помощь",
  563. de_doc="[Modul] [-f] - Hilfe anzeigen",
  564. tr_doc="[modül] [-f] - Yardımı göster",
  565. uz_doc="[modul] [-f] - Yordamni ko'rsatish",
  566. hi_doc="[मॉड्यूल] [-f] - मदद दिखाएं",
  567. ja_doc="[モジュール] [-f] - ヘルプを表示します",
  568. kr_doc="[모듈] [-f] - 도움말 표시",
  569. ar_doc="[الوحدة] [-f] - إظهار المساعدة",
  570. es_doc="[módulo] [-f] - Mostrar ayuda",
  571. )
  572. async def help(self, message: Message):
  573. """[module] [-f] - Show help"""
  574. args = utils.get_args_raw(message)
  575. force = False
  576. if "-f" in args:
  577. args = args.replace(" -f", "").replace("-f", "")
  578. force = True
  579. if args:
  580. await self.modhelp(message, args)
  581. return
  582. count = 0
  583. for i in self.allmodules.modules:
  584. try:
  585. if i.commands or i.inline_handlers:
  586. count += 1
  587. except Exception:
  588. pass
  589. hidden = self.get("hide", [])
  590. reply = self.strings("all_header").format(
  591. count,
  592. 0
  593. if force
  594. else len(
  595. [
  596. module
  597. for module in self.allmodules.modules
  598. if module.__class__.__name__ in hidden
  599. ]
  600. ),
  601. )
  602. shown_warn = False
  603. plain_ = []
  604. core_ = []
  605. inline_ = []
  606. no_commands_ = []
  607. for mod in self.allmodules.modules:
  608. if not hasattr(mod, "commands"):
  609. logger.debug("Module %s is not inited yet", mod.__class__.__name__)
  610. continue
  611. if mod.__class__.__name__ in self.get("hide", []) and not force:
  612. continue
  613. tmp = ""
  614. try:
  615. name = mod.strings["name"]
  616. except KeyError:
  617. name = getattr(mod, "name", "ERROR")
  618. inline = (
  619. hasattr(mod, "callback_handlers")
  620. and mod.callback_handlers
  621. or hasattr(mod, "inline_handlers")
  622. and mod.inline_handlers
  623. )
  624. if not inline:
  625. for cmd_ in mod.commands.values():
  626. try:
  627. inline = "await self.inline.form(" in inspect.getsource(
  628. cmd_.__code__
  629. )
  630. except Exception:
  631. pass
  632. core = mod.__origin__.startswith("<core")
  633. if core:
  634. emoji = self.config["core_emoji"]
  635. elif inline:
  636. emoji = self.config["hikka_emoji"]
  637. else:
  638. emoji = self.config["plain_emoji"]
  639. if (
  640. not getattr(mod, "commands", None)
  641. and not getattr(mod, "inline_handlers", None)
  642. and not getattr(mod, "callback_handlers", None)
  643. ):
  644. no_commands_ += [
  645. self.strings("mod_tmpl").format(self.config["empty_emoji"], name)
  646. ]
  647. continue
  648. tmp += self.strings("mod_tmpl").format(emoji, name)
  649. first = True
  650. commands = [
  651. name
  652. for name, func in mod.commands.items()
  653. if await self.allmodules.check_security(message, func) or force
  654. ]
  655. for cmd in commands:
  656. if first:
  657. tmp += self.strings("first_cmd_tmpl").format(cmd)
  658. first = False
  659. else:
  660. tmp += self.strings("cmd_tmpl").format(cmd)
  661. icommands = [
  662. name
  663. for name, func in mod.inline_handlers.items()
  664. if await self.inline.check_inline_security(
  665. func=func,
  666. user=message.sender_id,
  667. )
  668. or force
  669. ]
  670. for cmd in icommands:
  671. if first:
  672. tmp += self.strings("first_cmd_tmpl").format(f"🎹 {cmd}")
  673. first = False
  674. else:
  675. tmp += self.strings("cmd_tmpl").format(f"🎹 {cmd}")
  676. if commands or icommands:
  677. tmp += " )"
  678. if core:
  679. core_ += [tmp]
  680. elif inline:
  681. inline_ += [tmp]
  682. else:
  683. plain_ += [tmp]
  684. elif not shown_warn and (mod.commands or mod.inline_handlers):
  685. reply = (
  686. "<i>You have permissions to execute only these"
  687. f" commands</i>\n{reply}"
  688. )
  689. shown_warn = True
  690. plain_.sort(key=lambda x: x.split()[1])
  691. core_.sort(key=lambda x: x.split()[1])
  692. inline_.sort(key=lambda x: x.split()[1])
  693. no_commands_.sort(key=lambda x: x.split()[1])
  694. no_commands_ = "".join(no_commands_) if force else ""
  695. partial_load = (
  696. ""
  697. if self.lookup("Loader")._fully_loaded
  698. else f"\n\n{self.strings('partial_load')}"
  699. )
  700. await utils.answer(
  701. message,
  702. "{}\n{}{}{}{}{}".format(
  703. reply,
  704. "".join(core_),
  705. "".join(plain_),
  706. "".join(inline_),
  707. no_commands_,
  708. partial_load,
  709. ),
  710. )
  711. @loader.command(
  712. ru_doc="Показать ссылку на чат помощи Hikka",
  713. de_doc="Zeige den Link zum Hikka-Hilfe-Chat",
  714. tr_doc="Hikka yardım sohbetinin bağlantısını göster",
  715. uz_doc="Hikka yordam sohbatining havolasini ko'rsatish",
  716. hi_doc="हिक्का सहायता चैट का लिंक दिखाएं",
  717. ja_doc="ヒッカのヘルプチャットへのリンクを表示します",
  718. kr_doc="히카 도움말 채팅 링크를 표시합니다",
  719. ar_doc="إظهار رابط دردشة مساعدة هيكا",
  720. es_doc="Mostrar enlace al chat de ayuda de Hikka",
  721. )
  722. async def support(self, message):
  723. """Get link of Hikka support chat"""
  724. if message.out:
  725. await self.request_join("@hikka_talks", self.strings("request_join"))
  726. await utils.answer(
  727. message,
  728. self.strings("support").format(
  729. (
  730. utils.get_platform_emoji(self._client)
  731. if self._client.hikka_me.premium and CUSTOM_EMOJIS
  732. else "🌘"
  733. )
  734. ),
  735. )