loader.py 131 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034
  1. """Loads and registers modules"""
  2. # ©️ Dan Gazizullin, 2021-2023
  3. # This file is a part of Hikka Userbot
  4. # 🌐 https://github.com/hikariatama/Hikka
  5. # You can redistribute it and/or modify it under the terms of the GNU AGPLv3
  6. # 🔑 https://www.gnu.org/licenses/agpl-3.0.html
  7. import ast
  8. import asyncio
  9. import contextlib
  10. import copy
  11. import functools
  12. import importlib
  13. import inspect
  14. import logging
  15. import os
  16. import re
  17. import shutil
  18. import sys
  19. import time
  20. import typing
  21. import uuid
  22. from collections import ChainMap
  23. from importlib.machinery import ModuleSpec
  24. from urllib.parse import urlparse
  25. import requests
  26. import telethon
  27. from telethon.tl.functions.channels import JoinChannelRequest
  28. from telethon.tl.types import Channel, Message
  29. from .. import loader, main, utils
  30. from .._local_storage import RemoteStorage
  31. from ..compat import dragon, geek
  32. from ..compat.pyroproxy import PyroProxyClient
  33. from ..inline.types import InlineCall
  34. from ..types import CoreOverwriteError, CoreUnloadError, DragonModule
  35. logger = logging.getLogger(__name__)
  36. class FakeLock:
  37. async def __aenter__(self, *args):
  38. pass
  39. async def __aexit__(self, *args):
  40. pass
  41. class FakeNotifier:
  42. def __enter__(self):
  43. pass
  44. def __exit__(self, *args):
  45. pass
  46. @loader.tds
  47. class LoaderMod(loader.Module):
  48. """Loads modules"""
  49. strings = {
  50. "name": "Loader",
  51. "repo_config_doc": "URL to a module repo",
  52. "avail_header": "🎢 <b>Modules from repo</b>",
  53. "select_preset": (
  54. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Please select a"
  55. " preset</b>"
  56. ),
  57. "no_preset": (
  58. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Preset not found</b>"
  59. ),
  60. "preset_loaded": (
  61. "<emoji document_id=5784993237412351403>✅</emoji> <b>Preset loaded</b>"
  62. ),
  63. "no_module": (
  64. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Module not available"
  65. " in repo.</b>"
  66. ),
  67. "no_file": (
  68. "<emoji document_id=5312526098750252863>🚫</emoji> <b>File not found</b>"
  69. ),
  70. "provide_module": (
  71. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Provide a module to"
  72. " load</b>"
  73. ),
  74. "bad_unicode": (
  75. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Invalid Unicode"
  76. " formatting in module</b>"
  77. ),
  78. "load_failed": (
  79. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Loading failed. See"
  80. " logs for details</b>"
  81. ),
  82. "loaded": (
  83. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Module"
  84. "</b> <code>{}</code>{} <b>loaded {}</b>{}{}{}{}{}{}"
  85. ),
  86. "no_class": "<b>What class needs to be unloaded?</b>",
  87. "unloaded": "{} <b>Module {} unloaded.</b>",
  88. "not_unloaded": (
  89. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Module not"
  90. " unloaded.</b>"
  91. ),
  92. "requirements_failed": (
  93. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Requirements"
  94. " installation failed</b>"
  95. ),
  96. "requirements_failed_termux": (
  97. "<emoji document_id=5407025283456835913>🕶</emoji> <b>Requirements"
  98. " installation failed</b>\n<b>The most common reason is that Termux doesn't"
  99. " support many libraries. Don't report it as bug, this can't be solved.</b>"
  100. ),
  101. "requirements_installing": (
  102. "<emoji document_id=5328311576736833844>🚀</emoji> <b>Installing"
  103. " requirements:\n\n{}</b>"
  104. ),
  105. "requirements_restart": (
  106. "<emoji document_id=5875145601682771643>🚀</emoji> <b>Requirements"
  107. " installed, but a restart is required for</b> <code>{}</code> <b>to"
  108. " apply</b>"
  109. ),
  110. "all_modules_deleted": (
  111. "<emoji document_id=5784993237412351403>✅</emoji> <b>All modules"
  112. " deleted</b>"
  113. ),
  114. "undoc": "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> No docs",
  115. "ihandler": (
  116. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  117. ),
  118. "inline_init_failed": (
  119. "<emoji document_id=5454225457916420314>😖</emoji> <b>This module requires"
  120. " Hikka inline feature and initialization of InlineManager"
  121. " failed</b>\n<i>Please, remove one of your old bots from @BotFather and"
  122. " restart userbot to load this module</i>"
  123. ),
  124. "version_incompatible": (
  125. "<emoji document_id=5454225457916420314>😖</emoji> <b>This module requires"
  126. " Hikka {}+\nPlease, update with</b> <code>.update</code>"
  127. ),
  128. "ffmpeg_required": (
  129. "<emoji document_id=5454225457916420314>😖</emoji> <b>This module requires"
  130. " FFMPEG, which is not installed</b>"
  131. ),
  132. "developer": (
  133. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Developer:</b> {}"
  134. ),
  135. "depends_from": (
  136. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Dependencies:"
  137. "</b> \n{}"
  138. ),
  139. "by": "by",
  140. "module_fs": (
  141. "💿 <b>Would you like to save this module to filesystem, so it won't get"
  142. " unloaded after restart?</b>"
  143. ),
  144. "save": "💿 Save",
  145. "no_save": "🚫 Don't save",
  146. "save_for_all": "💽 Always save to fs",
  147. "never_save": "🚫 Never save to fs",
  148. "will_save_fs": (
  149. "💽 Now all modules, loaded with .loadmod will be saved to filesystem"
  150. ),
  151. "add_repo_config_doc": "Additional repos to load from",
  152. "share_link_doc": "Share module link in result message of .dlmod",
  153. "modlink": (
  154. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Link:"
  155. "</b> <code>{}</code>"
  156. ),
  157. "blob_link": (
  158. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>Do not use `blob`"
  159. " links to download modules. Consider switching to `raw` instead</b>"
  160. ),
  161. "suggest_subscribe": (
  162. "\n\n⭐️ <b>This module is"
  163. " made by {}. Do you want to join this channel to support developer?</b>"
  164. ),
  165. "subscribe": "💬 Subscribe",
  166. "no_subscribe": "🚫 Don't subscribe",
  167. "subscribed": "💬 Subscribed",
  168. "not_subscribed": "🚫 I will no longer suggest subscribing to this channel",
  169. "confirm_clearmodules": "⚠️ <b>Are you sure you want to clear all modules?</b>",
  170. "clearmodules": "🗑 Clear modules",
  171. "cancel": "🚫 Cancel",
  172. "overwrite_module": (
  173. "<emoji document_id=5454225457916420314>😖</emoji> <b>This module"
  174. " attempted to override the core one (</b><code>{}</code><b>)</b>\n\n<emoji"
  175. " document_id=5472146462362048818>💡</emoji><i> Don't report it as bug."
  176. " It's a security measure to prevent replacing core modules with some"
  177. " junk</i>"
  178. ),
  179. "overwrite_command": (
  180. "<emoji document_id=5454225457916420314>😖</emoji> <b>This module"
  181. " attempted to override the core command"
  182. " (</b><code>{}{}</code><b>)</b>\n\n<emoji"
  183. " document_id=5472146462362048818>💡</emoji><i> Don't report it as bug."
  184. " It's a security measure to prevent replacing core modules' commands with"
  185. " some junk</i>"
  186. ),
  187. "unload_core": (
  188. "<emoji document_id=5454225457916420314>😖</emoji> <b>You can't unload"
  189. " core module</b> <code>{}</code><b></b>\n\n<emoji"
  190. " document_id=5472146462362048818>💡</emoji><i> Don't report it as bug."
  191. " It's a security measure to prevent replacing core modules with some"
  192. " junk</i>"
  193. ),
  194. "cannot_unload_lib": (
  195. "<emoji document_id=5454225457916420314>😖</emoji> <b>You can't unload"
  196. " library</b>"
  197. ),
  198. "wait_channel_approve": (
  199. "<emoji document_id=5469741319330996757>💫</emoji> <b>Module"
  200. "</b> <code>{}</code> <b>requests permission to join channel <a"
  201. ' href="https://t.me/{}">{}</a>.\n\n<b><emoji'
  202. ' document_id="5467666648263564704">❓</emoji> Reason: {}</b>\n\n<i>Waiting'
  203. ' for <a href="https://t.me/{}">approval</a>...</i>'
  204. ),
  205. "installing": (
  206. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Installing module"
  207. "</b> <code>{}</code><b>...</b>"
  208. ),
  209. "repo_exists": (
  210. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo</b>"
  211. " <code>{}</code> <b>is already added</b>"
  212. ),
  213. "repo_added": (
  214. "<emoji document_id=5784993237412351403>✅</emoji> <b>Repo</b>"
  215. " <code>{}</code> <b>added</b>"
  216. ),
  217. "no_repo": (
  218. "<emoji document_id=5312526098750252863>🚫</emoji> <b>You need to specify"
  219. " repo to add</b>"
  220. ),
  221. "repo_not_exists": (
  222. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo</b>"
  223. " <code>{}</code> <b>is not added</b>"
  224. ),
  225. "repo_deleted": (
  226. "<emoji document_id=5784993237412351403>✅</emoji> <b>Repo</b>"
  227. " <code>{}</code> <b>deleted</b>"
  228. ),
  229. }
  230. strings_ru = {
  231. "repo_config_doc": "Ссылка для загрузки модулей",
  232. "add_repo_config_doc": "Дополнительные репозитории",
  233. "avail_header": "🎢 <b>Официальные модули из репозитория</b>",
  234. "select_preset": (
  235. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Выбери пресет</b>"
  236. ),
  237. "no_preset": (
  238. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Пресет не найден</b>"
  239. ),
  240. "preset_loaded": (
  241. "<emoji document_id=5784993237412351403>✅</emoji> <b>Пресет загружен</b>"
  242. ),
  243. "no_module": (
  244. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Модуль недоступен в"
  245. " репозитории.</b>"
  246. ),
  247. "no_file": (
  248. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Файл не найден</b>"
  249. ),
  250. "provide_module": (
  251. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Укажи модуль для"
  252. " загрузки</b>"
  253. ),
  254. "bad_unicode": (
  255. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Неверная кодировка"
  256. " модуля</b>"
  257. ),
  258. "load_failed": (
  259. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Загрузка не"
  260. " увенчалась успехом. Смотри логи.</b>"
  261. ),
  262. "loaded": (
  263. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Модуль"
  264. "</b> <code>{}</code>{} <b>загружен {}</b>{}{}{}{}{}{}"
  265. ),
  266. "no_class": "<b>А что выгружать то?</b>",
  267. "unloaded": "{} <b>Модуль {} выгружен.</b>",
  268. "not_unloaded": (
  269. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Модуль не"
  270. " выгружен.</b>"
  271. ),
  272. "requirements_failed": (
  273. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Ошибка установки"
  274. " зависимостей</b>"
  275. ),
  276. "requirements_failed_termux": (
  277. "<emoji document_id=5407025283456835913>🕶</emoji> <b>Ошибка установки"
  278. " зависимостей</b>\n<b>Наиболее часто возникает из-за того, что Termux не"
  279. " поддерживает многие библиотеки. Не сообщайте об этом как об ошибке, это"
  280. " не может быть исправлено.</b>"
  281. ),
  282. "requirements_installing": (
  283. "<emoji document_id=5328311576736833844>🚀</emoji> <b>Устанавливаю"
  284. " зависимости:\n\n{}</b>"
  285. ),
  286. "requirements_restart": (
  287. "<emoji document_id=5875145601682771643>🚀</emoji> <b>Зависимости"
  288. " установлены, но нужна перезагрузка для применения</b> <code>{}</code>"
  289. ),
  290. "all_modules_deleted": (
  291. "<emoji document_id=5784993237412351403>✅</emoji> <b>Модули удалены</b>"
  292. ),
  293. "undoc": "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> Нет описания",
  294. "ihandler": (
  295. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  296. ),
  297. "version_incompatible": (
  298. "<emoji document_id=5454225457916420314>😖</emoji> <b>Этому модулю"
  299. " требуется Hikka версии {}+\nОбновись с помощью</b> <code>.update</code>"
  300. ),
  301. "ffmpeg_required": (
  302. "<emoji document_id=5454225457916420314>😖</emoji> <b>Этому модулю"
  303. " требуется FFMPEG, который не установлен</b>"
  304. ),
  305. "developer": (
  306. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Разработчик:"
  307. "</b> {}"
  308. ),
  309. "depends_from": (
  310. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Зависимости:"
  311. "</b> \n{}"
  312. ),
  313. "by": "от",
  314. "module_fs": (
  315. "💿 <b>Ты хочешь сохранить модуль на жесткий диск, чтобы он не выгружался"
  316. " при перезагрузке?</b>"
  317. ),
  318. "save": "💿 Сохранить",
  319. "no_save": "🚫 Не сохранять",
  320. "save_for_all": "💽 Всегда сохранять",
  321. "never_save": "🚫 Никогда не сохранять",
  322. "will_save_fs": (
  323. "💽 Теперь все модули, загруженные из файла, будут сохраняться на жесткий"
  324. " диск"
  325. ),
  326. "inline_init_failed": (
  327. "<emoji document_id=5454225457916420314>😖</emoji> <b>Этому модулю нужен"
  328. " HikkaInline, а инициализация менеджера инлайна неудачна</b>\n<i>Попробуй"
  329. " удалить одного из старых ботов в @BotFather и перезагрузить юзербота</i>"
  330. ),
  331. "_cmd_doc_dlmod": "Скачивает и устаналвивает модуль из репозитория",
  332. "_cmd_doc_dlpreset": "Скачивает и устанавливает определенный набор модулей",
  333. "_cmd_doc_loadmod": "Скачивает и устанавливает модуль из файла",
  334. "_cmd_doc_unloadmod": "Выгружает (удаляет) модуль",
  335. "_cmd_doc_clearmodules": "Выгружает все установленные модули",
  336. "_cls_doc": "Загружает модули",
  337. "share_link_doc": "Указывать ссылку на модуль после загрузки через .dlmod",
  338. "modlink": (
  339. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Ссылка:"
  340. "</b> <code>{}</code>"
  341. ),
  342. "blob_link": (
  343. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>Не используй"
  344. " `blob` ссылки для загрузки модулей. Лучше загружать из `raw`</b>"
  345. ),
  346. "raw_link": (
  347. "\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Ссылка:"
  348. "</b> <code>{}</code>"
  349. ),
  350. "suggest_subscribe": (
  351. "\n\n⭐️ <b>Этот модуль"
  352. " сделан {}. Подписаться на него, чтобы поддержать разработчика?</b>"
  353. ),
  354. "subscribe": "💬 Подписаться",
  355. "no_subscribe": "🚫 Не подписываться",
  356. "subscribed": "💬 Подписался!",
  357. "unsubscribed": "🚫 Я больше не буду предлагать подписаться на этот канал",
  358. "confirm_clearmodules": (
  359. "⚠️ <b>Вы уверены, что хотите выгрузить все модули?</b>"
  360. ),
  361. "clearmodules": "🗑 Выгрузить модули",
  362. "cancel": "🚫 Отмена",
  363. "overwrite_module": (
  364. "<emoji document_id=5454225457916420314>😖</emoji> <b>Этот модуль"
  365. " попытался перезаписать встроенный (</b><code>{}</code><b>)</b>\n\n<emoji"
  366. " document_id=5472146462362048818>💡</emoji><i> Это не ошибка, а мера"
  367. " безопасности, требуемая для предотвращения замены встроенных модулей"
  368. " всяким хламом. Не сообщайте о ней в support чате</i>"
  369. ),
  370. "overwrite_command": (
  371. "<emoji document_id=5454225457916420314>😖</emoji> <b>Этот модуль"
  372. " попытался перезаписать встроенную команду"
  373. " (</b><code>{}</code><b>)</b>\n\n<emoji"
  374. " document_id=5472146462362048818>💡</emoji><i> Это не ошибка, а мера"
  375. " безопасности, требуемая для предотвращения замены команд встроенных"
  376. " модулей всяким хламом. Не сообщайте о ней в support чате</i>"
  377. ),
  378. "unload_core": (
  379. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ты не можешь"
  380. " выгрузить встроенный модуль</b> <code>{}</code><b></b>\n\n<emoji"
  381. " document_id=5472146462362048818>💡</emoji><i> Это не ошибка, а мера"
  382. " безопасности, требуемая для предотвращения замены встроенных модулей"
  383. " всяким хламом. Не сообщайте о ней в support чате</i>"
  384. ),
  385. "cannot_unload_lib": (
  386. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ты не можешь"
  387. " выгрузить библиотеку</b>"
  388. ),
  389. "wait_channel_approve": (
  390. "<emoji document_id=5469741319330996757>💫</emoji> <b>Модуль"
  391. "</b> <code>{}</code> <b>запрашивает разрешение на вступление в канал <a"
  392. ' href="https://t.me/{}">{}</a>.\n\n<b><emoji'
  393. ' document_id="5467666648263564704">❓</emoji> Причина:'
  394. ' {}</b>\n\n<i>Ожидание <a href="https://t.me/{}">подтверждения</a>...</i>'
  395. ),
  396. "installing": (
  397. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Устанавливаю модуль"
  398. "</b> <code>{}</code><b>...</b>"
  399. ),
  400. "repo_exists": (
  401. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Репозиторий</b>"
  402. " <code>{}</code> <b>уже добавлен</b>"
  403. ),
  404. "repo_added": (
  405. "<emoji document_id=5784993237412351403>✅</emoji> <b>Репозиторий</b>"
  406. " <code>{}</code> <b>добавлен</b>"
  407. ),
  408. "no_repo": (
  409. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Вы должны указать"
  410. " репозиторий для добавления</b>"
  411. ),
  412. "repo_not_exists": (
  413. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Репозиторий</b>"
  414. " <code>{}</code> <b>не добавлен</b>"
  415. ),
  416. "repo_deleted": (
  417. "<emoji document_id=5784993237412351403>✅</emoji> <b>Репозиторий</b>"
  418. " <code>{}</code> <b>удален</b>"
  419. ),
  420. }
  421. strings_fr = {
  422. "repo_config_doc": "Lien de téléchargement des modules",
  423. "add_repo_config_doc": "Dépôts supplémentaires",
  424. "avail_header": "🎢 <b>Modules officiels du dépôt</b>",
  425. "select_preset": (
  426. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Sélectionnez un"
  427. " préréglage</b>"
  428. ),
  429. "no_preset": (
  430. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Préréglage introuvable"
  431. "</b>"
  432. ),
  433. "preset_loaded": (
  434. "<emoji document_id=5784993237412351403>✅</emoji> <b>Préréglage chargé</b>"
  435. ),
  436. "no_module": (
  437. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Module non disponible"
  438. " dans le dépôt.</b>"
  439. ),
  440. "no_file": (
  441. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Fichier"
  442. " introuvable</b>"
  443. ),
  444. "provide_module": (
  445. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Indiquez le module à"
  446. " charger</b>"
  447. ),
  448. "bad_unicode": (
  449. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Encodage de module"
  450. " invalide</b>"
  451. ),
  452. "load_failed": (
  453. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Le chargement a"
  454. " échoué. Vérifiez les journaux.</b>"
  455. ),
  456. "loaded": (
  457. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Module</b>"
  458. " <code>{}</code>{} <b>chargé {}</b>{}{}{}{}{}{}"
  459. ),
  460. "no_class": "<b>Qu'est-ce qu'il faut décharger?</b>",
  461. "unloaded": "{} <b>Module {} déchargé.</b>",
  462. "not_unloaded": (
  463. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Le module n'a pas"
  464. " été déchargé.</b>"
  465. ),
  466. "requirements_failed": (
  467. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Échec de"
  468. " l'installation des dépendances</b>"
  469. ),
  470. "requirements_failed_termux": (
  471. "<emoji document_id=5407025283456835913>🕶</emoji> <b>Erreur d'installation"
  472. " des dépendances</b>\n<b>Cela arrive souvent parce que Termux ne"
  473. " prend pas en charge de nombreuses bibliothèques. N'indiquez pas cela"
  474. " comme une erreur, car cela ne peut pas être corrigé.</b>"
  475. ),
  476. "requirements_installing": (
  477. "<emoji document_id=5328311576736833844>🚀</emoji> <b>Installation"
  478. " des dépendances:\n\n{}</b>"
  479. ),
  480. "requirements_restart": (
  481. "<emoji document_id=5875145601682771643>🚀</emoji> <b>Les dépendances sont"
  482. " installées, mais un redémarrage est nécessaire pour les appliquer</b>"
  483. " <code>{}</code>"
  484. ),
  485. "all_modules_deleted": (
  486. "<emoji document_id=5784993237412351403>✅</emoji> <b>Modules supprimés</b>"
  487. ),
  488. "undoc": (
  489. "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> Aucune description"
  490. ),
  491. "ihandler": (
  492. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  493. ),
  494. "version_incompatible": (
  495. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ce module"
  496. " nécessite Hikka version {}+\nMettez à jour avec</b> <code>.update</code>"
  497. ),
  498. "ffmpeg_required": (
  499. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ce module"
  500. " nécessite FFMPEG, qui n'est pas installé</b>"
  501. ),
  502. "developer": (
  503. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Développeur:"
  504. "</b> {}"
  505. ),
  506. "depends_from": (
  507. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Dépendances:"
  508. "</b> \n{}"
  509. ),
  510. "by": "by",
  511. "module_fs": (
  512. "💿 <b>Voulez-vous sauvegarder le module sur le disque dur pour qu'il ne"
  513. " soit pas déchargé lors du redémarrage?</b>"
  514. ),
  515. "save": "💿 Enregistrer",
  516. "no_save": "🚫 Ne pas enregistrer",
  517. "save_for_all": "💽 Toujours enregistrer",
  518. "never_save": "🚫 Ne jamais enregistrer",
  519. "will_save_fs": (
  520. "💽 Maintenant tous les modules téléchargés à partir d'un fichier seront"
  521. " sauvegardés sur le disque"
  522. ),
  523. "inline_init_failed": (
  524. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ce module a besoin de"
  525. " HikkaInline, mais l'initialisation du gestionnaire d'inline a échoué</b>"
  526. "\n<i>Essayez de supprimer un ancien bot dans @BotFather et de redémarrer"
  527. " l'usagerbot</i>"
  528. ),
  529. "_cmd_doc_dlmod": "Télécharge et installe le module à partir du référentiel",
  530. "_cmd_doc_dlpreset": "Télécharge et installe un ensemble de modules spécifique",
  531. "_cmd_doc_loadmod": "Télécharge et installe le module à partir d'un fichier",
  532. "_cmd_doc_unloadmod": "Décharge (supprime) le module",
  533. "_cmd_doc_clearmodules": "Décharge tous les modules installés",
  534. "_cls_doc": "Charge les modules",
  535. "share_link_doc": (
  536. "Spécifiez le lien vers le module après avoir téléchargé avec .dlmod"
  537. ),
  538. "modlink": (
  539. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Lien:"
  540. "</b> <code>{}</code>"
  541. ),
  542. "blob_link": (
  543. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>Ne utilisé `blob`"
  544. " liens pour télécharger des modules. Il est préférable de télécharger à"
  545. " partir de `raw`</b>"
  546. ),
  547. "raw_link": (
  548. "\n<emoji document_id=6037284117505116849>🌐</emoji> <b>lien:"
  549. "</b> <code>{}</code>"
  550. ),
  551. "suggest_subscribe": (
  552. "\n\n⭐️ <b>Ce module fait {}. Abonnez-vous à lui pour le soutenir?</b>"
  553. ),
  554. "subscribe": "💬 S'abonner",
  555. "no_subscribe": "🚫 Ne pas s'abonner",
  556. "subscribed": "💬 Je m'abonne!",
  557. "unsubscribed": "🚫 Je ne vous proposerai plus de m'abonner à ce canal",
  558. "confirm_clearmodules": (
  559. "⚠️ <b>Êtes-vous sûr de vouloir décharger tous les modules?</b>"
  560. ),
  561. "clearmodules": "🗑 Décharger les modules",
  562. "cancel": "🚫 Annuler",
  563. "overwrite_module": (
  564. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ce module a tenté"
  565. " d'écraser le module intégré (</b><code>{}</code><b>)</b>\n\n<emoji"
  566. " document_id=5472146462362048818>💡</emoji><i> Ce n'est pas une erreur,"
  567. " mais une mesure de sécurité nécessaire pour empêcher la substitution des"
  568. " modules intégrés avec n'importe quel bazar. Ne signalez pas cela à la"
  569. " chaîne support</i>"
  570. ),
  571. "overwrite_command": (
  572. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ce module a essayé"
  573. " de remplacer une commande intégrée"
  574. " (</b><code>{}</code><b>)</b>\n\n<emoji"
  575. " document_id=5472146462362048818>💡</emoji><i> Ce n'est pas une"
  576. " erreur, mais une mesure de sécurité requise pour éviter de remplacer"
  577. " les commandes intégrées par du spam. Ne le signale pas au support"
  578. " chat</i>"
  579. ),
  580. "unload_core": (
  581. "<emoji document_id=5454225457916420314>😖</emoji> <b>Vous ne pouvez pas"
  582. " décharger le module intégré</b> <code>{}</code><b></b>\n\n<emoji"
  583. " document_id=5472146462362048818>💡</emoji><i> Ce n'est pas une"
  584. " erreur, mais une mesure de sécurité requise pour éviter de remplacer"
  585. " les modules intégrés par du spam. Ne le signale pas au support"
  586. " chat</i>"
  587. ),
  588. "cannot_unload_lib": (
  589. "<emoji document_id=5454225457916420314>😖</emoji> <b>Vous ne pouvez pas"
  590. " décharger une bibliothèque</b>"
  591. ),
  592. "wait_channel_approve": (
  593. "<emoji document_id=5469741319330996757>💫</emoji> <b>Le module</b>"
  594. " <code>{}</code> <b>demande à rejoindre le canal <a"
  595. ' href="https://t.me/{}">{}</a>.\n\n<b><emoji'
  596. ' document_id="5467666648263564704">❓</emoji> Raison: {}</b>\n\n<i>En'
  597. ' attente de <a href="https://t.me/{}">confirmation</a>...</i>'
  598. ),
  599. "installing": (
  600. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Installation du module"
  601. "</b> <code>{}</code><b>...</b>"
  602. ),
  603. "repo_exists": (
  604. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Le dépôt</b>"
  605. " <code>{}</code> <b>est déjà ajouté</b>"
  606. ),
  607. "repo_added": (
  608. "<emoji document_id=5784993237412351403>✅</emoji> <b>Le dépôt</b>"
  609. " <code>{}</code> <b>ajouté</b>"
  610. ),
  611. "no_repo": (
  612. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Vous devez spécifier"
  613. " le dépôt à ajouter</b>"
  614. ),
  615. "repo_not_exists": (
  616. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Le dépôt</b>"
  617. " <code>{}</code> <b>n'est pas ajouté</b>"
  618. ),
  619. "repo_deleted": (
  620. "<emoji document_id=5784993237412351403>✅</emoji> <b>Le dépôt</b>"
  621. " <code>{}</code> <b>supprimé</b>"
  622. ),
  623. }
  624. strings_it = {
  625. "repo_config_doc": "Link per il download dei moduli",
  626. "add_repo_config_doc": "Repository aggiuntivi",
  627. "avail_header": "🎢 <b>Moduli ufficiali dal repository</b>",
  628. "select_preset": (
  629. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Seleziona un"
  630. " preset</b>"
  631. ),
  632. "no_preset": (
  633. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Preset non trovato</b>"
  634. ),
  635. "preset_loaded": (
  636. "<emoji document_id=5784993237412351403>✅</emoji> <b>Preset caricato</b>"
  637. ),
  638. "no_module": (
  639. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Il modulo non è"
  640. " disponibile nel repository.</b>"
  641. ),
  642. "no_file": (
  643. "<emoji document_id=5312526098750252863>🚫</emoji> <b>File non trovato</b>"
  644. ),
  645. "provide_module": (
  646. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Specifica il modulo"
  647. " da caricare</b>"
  648. ),
  649. "bad_unicode": (
  650. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Codifica modulo"
  651. " errata</b>"
  652. ),
  653. "load_failed": (
  654. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Caricamento non"
  655. " riuscito. Vedi i log.</b>"
  656. ),
  657. "loaded": (
  658. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Modulo"
  659. "</b> <code>{}</code>{} <b>caricato {}</b>{}{}{}{}{}{}"
  660. ),
  661. "no_class": "<b>Cosa devo scaricare?</b>",
  662. "unloaded": "{} <b>Modulo {} scaricato.</b>",
  663. "not_unloaded": (
  664. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Modulo non"
  665. " scaricato.</b>"
  666. ),
  667. "requirements_failed": (
  668. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Errore di"
  669. " installazione dei requisiti</b>"
  670. ),
  671. "requirements_failed_termux": (
  672. "<emoji document_id=5407025283456835913>🕶</emoji> <b>Errore"
  673. " nell'installazione dei requisiti</b>\n<b>Si verifica più frequentemente"
  674. " perché Termux non supporta molte librerie. Non segnalare questo come"
  675. " errore, non può essere corretto.</b>"
  676. ),
  677. "requirements_installing": (
  678. "<emoji document_id=5328311576736833844>🚀</emoji> <b>Installazione"
  679. " dei requisiti:\n\n{}</b>"
  680. ),
  681. "requirements_restart": (
  682. "<emoji document_id=5875145601682771643>🚀</emoji> <b>I requisiti sono"
  683. " installati, ma è necessario riavviare per applicare</b> <code>{}</code>"
  684. ),
  685. "all_modules_deleted": (
  686. "<emoji document_id=5784993237412351403>✅</emoji> <b>I moduli sono stati"
  687. " eliminati</b>"
  688. ),
  689. "undoc": (
  690. "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> Nessuna descrizione"
  691. ),
  692. "ihandler": (
  693. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  694. ),
  695. "version_incompatible": (
  696. "<emoji document_id=5454225457916420314>😖</emoji> <b>Questo modulo"
  697. " richiede Hikka versione {}+\nAggiornati con</b> <code>.update</code>"
  698. ),
  699. "ffmpeg_required": (
  700. "<emoji document_id=5454225457916420314>😖</emoji> <b>Questo modulo"
  701. " richiede FFMPEG, che non è installato</b>"
  702. ),
  703. "developer": (
  704. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Sviluppatore:"
  705. "</b> {}"
  706. ),
  707. "depends_from": (
  708. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Dependenze:"
  709. "</b> \n{}"
  710. ),
  711. "by": "di",
  712. "module_fs": (
  713. "💿 <b>Vuoi salvare il modulo sul disco fisso per non scaricarlo"
  714. " al riavvio?</b>"
  715. ),
  716. "save": "💿 Salva",
  717. "no_save": "🚫 Non salvare",
  718. "save_for_all": "💽 Salva sempre",
  719. "never_save": "🚫 Non salvare mai",
  720. "will_save_fs": (
  721. "💽 Ora tutti i moduli caricati da file verranno salvati sul disco fisso"
  722. ),
  723. "inline_init_failed": (
  724. "<emoji document_id=5454225457916420314>😖</emoji> <b>Questo modulo ha"
  725. " bisogno di HikkaInline, ma l'inizializzazione del gestore inline è"
  726. " fallita</b>\n<i>Prova a rimuovere uno dei vecchi bot in @BotFather e"
  727. " riavviare l'utente</i>"
  728. ),
  729. "_cmd_doc_dlmod": "Scarica e installa il modulo dal repository",
  730. "_cmd_doc_dlpreset": "Scarica e installa un insieme specifico di moduli",
  731. "_cmd_doc_loadmod": "Scarica e installa il modulo dal file",
  732. "_cmd_doc_unloadmod": "Scarica (rimuovi) il modulo",
  733. "_cmd_doc_clearmodules": "Scarica tutti i moduli installati",
  734. "_cls_doc": "Carica moduli",
  735. "share_link_doc": (
  736. "Specifica il link del modulo dopo aver caricato tramite .dlmod"
  737. ),
  738. "modlink": (
  739. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Link:"
  740. "</b> <code>{}</code>"
  741. ),
  742. "blob_link": (
  743. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>Non usare"
  744. " `blob` link per caricare i moduli. È meglio caricare da `raw`</b>"
  745. ),
  746. "raw_link": (
  747. "\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Link:"
  748. "</b> <code>{}</code>"
  749. ),
  750. "suggest_subscribe": (
  751. "\n\n⭐️ <b>Questo modulo"
  752. " è stato fatto da {}. Sottoscrivere per sostenere il sviluppatore?</b>"
  753. ),
  754. "subscribe": "💬 Sottoscrivi",
  755. "no_subscribe": "🚫 Non sottoscrivere",
  756. "subscribed": "💬 Sottoscritto!",
  757. "unsubscribed": "🚫 Non ti chiederò più di sottoscrivere questo canale",
  758. "confirm_clearmodules": (
  759. "⚠️ <b>Sei sicuro di voler scaricare tutti i moduli?</b>"
  760. ),
  761. "clearmodules": "🗑 Scaricare i moduli",
  762. "cancel": "🚫 Annulla",
  763. "overwrite_module": (
  764. "<emoji document_id=5454225457916420314>😖</emoji> <b>Questo modulo ha"
  765. " tentato di sovrascrivere un modulo integrato"
  766. " (</b><code>{}</code><b>)</b>\n\n<emoji"
  767. " document_id=5472146462362048818>💡</emoji><i> Non è un errore, ma un"
  768. " misura di sicurezza richiesta per impedire di sovrascrivere i moduli"
  769. " integrati con qualsiasi schifo. Non segnalare questo errore nel supporto"
  770. " chat</i>"
  771. ),
  772. "overwrite_command": (
  773. "<emoji document_id=5454225457916420314>😖</emoji> <b>Questo modulo ha"
  774. " tentato di sovrascrivere un comando integrato"
  775. " (</b><code>{}</code><b>)</b>\n\n<emoji"
  776. " document_id=5472146462362048818>💡</emoji><i> Non è un errore, ma un"
  777. " misura di sicurezza richiesta per impedire di sovrascrivere i comandi"
  778. " integrati con qualsiasi schifo. Non segnalare questo errore nel supporto"
  779. " chat</i>"
  780. ),
  781. "unload_core": (
  782. "<emoji document_id=5454225457916420314>😖</emoji> <b>Non puoi scaricare un"
  783. " modulo integrato</b> <code>{}</code><b></b>\n\n<emoji"
  784. " document_id=5472146462362048818>💡</emoji><i> Non è un errore, ma un"
  785. " misura di sicurezza richiesta per impedire di sovrascrivere i moduli"
  786. " integrati con qualsiasi schifo. Non segnalare questo errore nel supporto"
  787. " chat</i>"
  788. ),
  789. "cannot_unload_lib": (
  790. "<emoji document_id=5454225457916420314>😖</emoji> <b>Non puoi"
  791. " scaricare una libreria</b>"
  792. ),
  793. "wait_channel_approve": (
  794. "<emoji document_id=5469741319330996757>💫</emoji> <b>Il modulo</b>"
  795. " <code>{}</code> <b>sta richiedendo l'approvazione per entrare nel canale"
  796. ' <a href="https://t.me/{}">{}</a>.\n\n<b><emoji'
  797. ' document_id="5467666648263564704">❓</emoji> Motivo: {}</b>\n\n<i>In'
  798. ' attesa di <a href="https://t.me/{}">conferma</a>...</i>'
  799. ),
  800. "installing": (
  801. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Sto installando il"
  802. " modulo</b> <code>{}</code><b>...</b>"
  803. ),
  804. "repo_exists": (
  805. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Il repo</b>"
  806. " <code>{}</code> <b>è già stato aggiunto</b>"
  807. ),
  808. "repo_added": (
  809. "<emoji document_id=5784993237412351403>✅</emoji> <b>Il repo</b>"
  810. " <code>{}</code> <b>è stato aggiunto</b>"
  811. ),
  812. "no_repo": (
  813. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Devi specificare il"
  814. " repo da aggiungere</b>"
  815. ),
  816. "repo_not_exists": (
  817. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Il repo</b>"
  818. " <code>{}</code> <b>non è stato aggiunto</b>"
  819. ),
  820. "repo_deleted": (
  821. "<emoji document_id=5784993237412351403>✅</emoji> <b>Il repo</b>"
  822. " <code>{}</code> <b>è stato rimosso</b>"
  823. ),
  824. }
  825. strings_de = {
  826. "repo_config_doc": "Modul-Download-Link",
  827. "add_repo_config_doc": "Zusätzliche Repositorys",
  828. "avail_header": "🎢 <b>Offizielle Moduleaus Repository</b>",
  829. "select_preset": (
  830. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Voreinstellung"
  831. " auswählen</b>"
  832. ),
  833. "no_preset": (
  834. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Voreinstellung nicht"
  835. " gefunden</b>"
  836. ),
  837. "preset_loaded": (
  838. "<emoji document_id=5784993237412351403>✅</emoji> <b>Voreinstellung"
  839. " geladen</b>"
  840. ),
  841. "no_module": (
  842. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Modul nicht verfügbar"
  843. " in Repositorys.</b>"
  844. ),
  845. "no_file": (
  846. "<emoji document_id=5312526098750252863>🚫</emoji><b>Datei nicht"
  847. " gefunden</b>"
  848. ),
  849. "provide_module": (
  850. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Geben Sie ein zu"
  851. " ladendes Modul an</b>"
  852. ),
  853. "bad_unicode": (
  854. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Ungültige Codierung"
  855. "Modul</b>"
  856. ),
  857. "load_failed": (
  858. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Lädt nicht"
  859. " war erfolgreich. Sehen Sie sich die Protokolle an.</b>"
  860. ),
  861. "loaded": (
  862. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Modul"
  863. "</b> <code>{}</code>{} <b>geladen {}</b>{}{}{}{}{}{}"
  864. ),
  865. "no_class": "<b>Was soll dann hochgeladen werden?</b>",
  866. "unloaded": "{} <b>{} Modul entladen.</b>",
  867. "not_unloaded": (
  868. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Modul nicht"
  869. " entladen.</b>"
  870. ),
  871. "requirements_failed": (
  872. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Installation"
  873. " fehlgeschlagen Abhängigkeiten</b>"
  874. ),
  875. "requirements_failed_termux": (
  876. "<emoji document_id=5407025283456835913>🕶</emoji> <b>Installation"
  877. " fehlgeschlagenAbhängigkeiten</b>\n<b>Tritt am häufigsten auf, weil Termux"
  878. " dies nicht tutunterstützt viele Bibliotheken. Melden Sie dies nicht als"
  879. " Fehler, es ist kann nicht behoben werden.</b>"
  880. ),
  881. "requirements_installing": (
  882. "<emoji document_id=5328311576736833844>🚀</emoji> <b>Wird installiert"
  883. " Abhängigkeiten:\n\n{}</b>"
  884. ),
  885. "requirements_restart": (
  886. "<emoji document_id=5875145601682771643>🚀</emoji> <b>Abhängigkeiten"
  887. " installiert, muss aber neu gestartet werden, um</b> <code>{}</code>"
  888. " anzuwenden"
  889. ),
  890. "all_modules_deleted": (
  891. "<emoji document_id=5784993237412351403>✅</emoji><b>Module entfernt</b>"
  892. ),
  893. "undoc": (
  894. "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> Keine Beschreibung"
  895. ),
  896. "ihandler": (
  897. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  898. ),
  899. "version_incompatible": (
  900. "<emoji document_id=5454225457916420314>😖</emoji> <b>Zu diesem Modul"
  901. "erfordert Hikka-Version {}+\nUpdate mit</b> <code>.update</code>"
  902. ),
  903. "ffmpeg_required": (
  904. "<emoji document_id=5454225457916420314>😖</emoji> <b>Zu diesem Modul"
  905. "benötigt FFMPEG, das nicht installiert ist</b>"
  906. ),
  907. "developer": (
  908. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Entwickler:</b>{}"
  909. ),
  910. "depends_from": (
  911. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Abhängigkeiten:"
  912. "</b>\n{}"
  913. ),
  914. "by": "von",
  915. "module_fs": (
  916. "💿 <b>Sie möchten das Modul auf Ihrer Festplatte speichern, damit es nicht"
  917. " entladen wird.beim Neustart?</b>"
  918. ),
  919. "save": "💿 Speichern",
  920. "no_save": "🚫 Nicht speichern",
  921. "save_for_all": "💽 Immer speichern",
  922. "never_save": "🚫 Nie speichern",
  923. "will_save_fs": (
  924. "💽 Jetzt werden alle aus der Datei geladenen Module auf der Festplatte"
  925. " gespeichertScheibe"
  926. ),
  927. "inline_init_failed": (
  928. "<emoji document_id=5454225457916420314>😖</emoji> <b>Dieses Modul benötigt"
  929. " Initialisierung von HikkaInline und Inline-Manager"
  930. " fehlgeschlagen</b>\n<i>Versuchen Sie esLösche einen der alten Bots in"
  931. " @BotFather und lade den Userbot neu</i>"
  932. ),
  933. "_cmd_doc_dlmod": "Modul aus dem Repository herunterladen und installieren",
  934. "_cmd_doc_dlpreset": (
  935. "Lädt einen bestimmten Satz von Modulen herunter und installiert ihn"
  936. ),
  937. "_cmd_doc_loadmod": (
  938. "Lädt ein Modul aus einer Datei herunter und installiert es"
  939. ),
  940. "_cmd_doc_unloadmod": "Entlädt (löscht) ein Modul",
  941. "_cmd_doc_clearmodules": "Entlädt alle installierten Module",
  942. "_cls_doc": "Module laden",
  943. "share_link_doc": (
  944. "Stellen Sie nach dem Laden über .dlmod einen Link zum Modul bereit"
  945. ),
  946. "modlink": (
  947. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Link:"
  948. "</b><code>{}</code>"
  949. ),
  950. "blob_link": (
  951. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>Verwenden Sie"
  952. " keine `Blob`-Links, um Module zu laden. Laden Sie besser von`roh`</b>"
  953. ),
  954. "raw_link": (
  955. "\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Link:"
  956. "</b><code>{}</code>"
  957. ),
  958. "suggest_subscribe": (
  959. "\n\n⭐️ <b>Dieses Modul"
  960. " Erledigt von {}. Abonnieren, um den Entwickler zu unterstützen?</b>"
  961. ),
  962. "subscribe": "💬 Abonnieren",
  963. "no_subscribe": "🚫 Nicht abonnieren",
  964. "subscribed": "💬 Abonniert!",
  965. "unsubscribed": "🚫 Ich werde nicht wieder anbieten, diesen Kanal zu abonnieren",
  966. "confirm_clearmodules": (
  967. "⚠️ <b>Sind Sie sicher, dass Sie alle Module entladen möchten?</b>"
  968. ),
  969. "clearmodules": "🗑 Module entladen",
  970. "cancel": "🚫 Stornieren",
  971. "overwrite_module": (
  972. "<emoji document_id=5454225457916420314>😖</emoji> <b>Dieses Modulversucht,"
  973. " eingebautes (</b><code>{}</code><b>) zu"
  974. " überschreiben</b>\n\n<emojidocument_id=5472146462362048818>💡</emoji><i>"
  975. " Dies ist kein Fehler, sondern eine MaßnahmeSicherheit erforderlich, um"
  976. " den Austausch von eingebauten Modulen zu verhindern mit allerlei Müll."
  977. " Melde es nicht im Support-Chat</i>"
  978. ),
  979. "overwrite_command": (
  980. "<emoji document_id=5454225457916420314>😖</emoji> <b>Dieses Modulversucht"
  981. " eingebauten Befehl zu überschreiben"
  982. " (</b><code>{}</code><b>)</b>\n\n<emojidocument_id=5472146462362048818>💡</emoji><i>"
  983. " Dies ist kein Fehler, sondern eine MaßnahmeSicherheit erforderlich, um"
  984. " die Ersetzung eingebauter Befehle zu verhindernModule mit allerlei Müll."
  985. " Melde es nicht im Support-Chat</i>"
  986. ),
  987. "unload_core": (
  988. "<emoji document_id=5454225457916420314>😖</emoji> <b>Das kannst du nicht"
  989. " integriertes Modul entladen</b>"
  990. " <code>{}</code><b></b>\n\n<emojidocument_id=5472146462362048818>💡</emoji><i>"
  991. " Dies ist kein Fehler, sondern eine MaßnahmeSicherheit erforderlich, um"
  992. " den Austausch von eingebauten Modulen zu verhindern mit allerlei Müll."
  993. " Melde es nicht im Support-Chat</i>"
  994. ),
  995. "cannot_unload_lib": (
  996. "<emoji document_id=5454225457916420314>😖</emoji> <b>Das kannst du nicht"
  997. "Bibliothek entladen</b>"
  998. ),
  999. "wait_channel_approve": (
  1000. "<emoji document_id=5469741319330996757>💫</emoji> <b>Modul"
  1001. "</b> <code>{}</code> <b>bittet um Erlaubnis, Kanal <a beizutreten"
  1002. ' href="https://t.me/{}">{}</a>.\n\n<b><emoji'
  1003. ' document_id="5467666648263564704">❓</emoji> Grund:'
  1004. ' {}</b>\n\n<i>Warten auf <a href="https://t.me/{}">Bestätigung</a>...</i>'
  1005. ),
  1006. "installing": (
  1007. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Modul installieren"
  1008. "</b> <code>{}</code><b>...</b>"
  1009. ),
  1010. "repo_exists": (
  1011. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo</b>"
  1012. " <code>{}</code> <b>wurde bereits hinzugefügt</b>"
  1013. ),
  1014. "repo_added": (
  1015. "<emoji document_id=5784993237412351403>✅</emoji> <b>Repo</b>"
  1016. " <code>{}</code> <b>wurde hinzugefügt</b>"
  1017. ),
  1018. "no_repo": (
  1019. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Du musst ein Repo"
  1020. " angeben um es hinzuzufügen</b>"
  1021. ),
  1022. "repo_not_exists": (
  1023. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo</b>"
  1024. " <code>{}</code> <b>wurde nicht hinzugefügt</b>"
  1025. ),
  1026. "repo_deleted": (
  1027. "<emoji document_id=5784993237412351403>✅</emoji> <b>Repo</b>"
  1028. " <code>{}</code> <b>wurde gelöscht</b>"
  1029. ),
  1030. }
  1031. strings_tr = {
  1032. "repo_config_doc": "Bir modül deposunun URL'si",
  1033. "avail_header": "🎢 <b>Depodan modüller</b>",
  1034. "select_preset": (
  1035. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Lütfen bir ön ayar"
  1036. " seçin</b>"
  1037. ),
  1038. "no_preset": (
  1039. "<emoji document_id=53752013968596607943>🚫</emoji> <b>Ön ayar"
  1040. " bulunamadı</b>"
  1041. ),
  1042. "preset_loaded": (
  1043. "<emoji document_id=5784993237412351403>✅</emoji> <b>Ön ayar yüklendi</b>"
  1044. ),
  1045. "no_module": (
  1046. "<emoji document_id=53752013968596607943>🚫</emoji> <b>Modül depoda mevcut"
  1047. " değil.</b>"
  1048. ),
  1049. "no_file": (
  1050. "<emoji document_id=53752013968596607943>🚫</emoji> <b>Dosya bulunamadı</b>"
  1051. ),
  1052. "provide_module": (
  1053. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Yüklenecek bir modül"
  1054. " sağlayın</b>"
  1055. ),
  1056. "bad_unicode": (
  1057. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Modülde geçersiz"
  1058. " Unicode biçimlendirmesi</b>"
  1059. ),
  1060. "load_failed": (
  1061. "<emoji document_id=53752013968596607943>🚫</emoji> <b>Yükleme başarısız"
  1062. " oldu. Ayrıntılar için kayıtlara bakınız</b>"
  1063. ),
  1064. "loaded": (
  1065. "<emoji document_id=5188377234380954537>🌘</emoji><b>"
  1066. "</b> <code>{}</code>{} <b>isimli modül yüklendi {}</b>{}{}{}{}{}{}"
  1067. ),
  1068. "no_class": "<b>Hangi modülün kaldırılması gerekiyor?</b>",
  1069. "unloaded": "{} <b>{} isimli modül kaldırıldı.</b>",
  1070. "not_unloaded": (
  1071. "<emoji document_id=53752013968596607943>🚫</emoji> <b>Modül "
  1072. " kaldırılamadı.</b>"
  1073. ),
  1074. "requirements_failed": (
  1075. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Gereksinimlerin"
  1076. " yüklemesi başarısız oldu</b>"
  1077. ),
  1078. "requirements_failed_termux": (
  1079. "<emoji document_id=5407025283456835913>🕶</emoji> <b>Gereksinimlerin"
  1080. " kurulumu başarısız oldu</b>\n<b>Bu hatanın en yaygın nedeni Termux'un"
  1081. " birçok kütüphaneyi desteklememesidir. Lütfen bu hatayı bildirme,"
  1082. " çözülmesi imkansız.</b>"
  1083. ),
  1084. "requirements_installing": (
  1085. "<emoji document_id=5328311576736833844>🚀</emoji> <b>Gereksinimler"
  1086. " yükleniyor:\n\n{}</b>"
  1087. ),
  1088. "requirements_restart": (
  1089. "<emoji document_id=5875145601682771643>🚀</emoji> <b>Gereksinimler"
  1090. " yüklendi, ancak</b> <code>{}</code> <b>uygulanabilmesi için yeniden"
  1091. " başlatma gerekiyor</b>"
  1092. ),
  1093. "all_modules_deleted": (
  1094. "<emoji document_id=5784993237412351403>✅</emoji> <b>Tüm modüller"
  1095. " silindi</b>"
  1096. ),
  1097. "undoc": "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> Doküman yok",
  1098. "ihandler": (
  1099. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  1100. ),
  1101. "inline_init_failed": (
  1102. "<emoji document_id=5454225457916420314>😖</emoji> <b>Bu modül Hikka satır"
  1103. " içi özelliği gerektiriyor fakat InlineManager'ın yüklenirken hata"
  1104. " verdi</b>\n<i>Lütfen eski botlarınızdan birini @BotFather'dan kaldırın ve"
  1105. " bu modülü yüklemek için kullanıcı botunu yeniden başlatın</i>"
  1106. ),
  1107. "version_incompatible": (
  1108. "<emoji document_id=5454225457916420314>😖</emoji> <b>Bu modül Hikka {}"
  1109. " sürümünü gerektirmektedir.+\nLütfen,</b> <code>.update</code> kodu ile"
  1110. " Hikka'yı güncelleyin"
  1111. ),
  1112. "ffmpeg_required": (
  1113. "<emoji document_id=5454225457916420314>😖</emoji> <b>Bu modül yüklü"
  1114. " olmayan.FFMPEG kütüphanesini gerektirmektedir</b>"
  1115. ),
  1116. "developer": (
  1117. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Geliştirici:"
  1118. "</b> {}"
  1119. ),
  1120. "depends_from": (
  1121. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Bağımlılıklar:"
  1122. "</b> \n{}"
  1123. ),
  1124. "module_fs": (
  1125. "💿 <b>Bu modülü dosya sistemine kaydetmek (FS) ister misiniz?"
  1126. " kaydederseniz yeniden başlattığınızda kaldırılmayacaktır.</b>"
  1127. ),
  1128. "save": "💿 Kaydet",
  1129. "no_save": "🚫 Kaydetme",
  1130. "save_for_all": "💽 Her zaman FS'ye kaydet",
  1131. "never_save": "🚫 Asla FS'ye kaydetme",
  1132. "will_save_fs": (
  1133. "💽 Artık .loadmod ile yüklenen tüm modüller dosya sistemine kaydedilecek"
  1134. ),
  1135. "add_repo_config_doc": "Yüklenecek ek depolar",
  1136. "share_link_doc": ".dlmod'un sonuç mesajında ​​modül bağlantısını paylaşın",
  1137. "modlink": (
  1138. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Bağlantı:"
  1139. "</b> <code>{}</code>"
  1140. ),
  1141. "blob_link": (
  1142. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>Modülleri"
  1143. " indirmek için `blob` bağlantılarını kullanmayın. Onun yerine 'raw'"
  1144. " kullanabilirsiniz</b>"
  1145. ),
  1146. "suggest_subscribe": (
  1147. "\n\n⭐️ <b>Bu modül {}"
  1148. " tarafından yapılmıştır. Geliştiriciyi desteklemek için bu kanala katılmak"
  1149. " ister misiniz?</b>"
  1150. ),
  1151. "subscribe": "💬 Abone ol",
  1152. "no_subscribe": "🚫 Abone olma",
  1153. "subscribed": "💬 Abone olundu",
  1154. "not_subscribed": "🚫 Artık bu kanala abone olmayı önermeyeceğim",
  1155. "confirm_clearmodules": (
  1156. "⚠️ <b>Tüm modülleri silmek istediğinizden emin misiniz?</b>"
  1157. ),
  1158. "clearmodules": "🗑 Modülleri temizle",
  1159. "cancel": "🚫 İptal",
  1160. "overwrite_module": (
  1161. "<emoji document_id=5454225457916420314>😖</emoji> <b>Bu modül, çekirdeği"
  1162. " geçersiz kılmaya çalıştı (</b><code>{}</code><b>)</b>\n\n<emoji"
  1163. " document_id=5472146462362048818>💡</emoji><i> Lütfen bunu hata olarak"
  1164. " bildirmeyin. Bu, çekirdek modüllerin değiştirilmesini önlemek için"
  1165. " bir güvenlik önlemidir</i>"
  1166. ),
  1167. "overwrite_command": (
  1168. "<emoji document_id=5454225457916420314>😖</emoji> <b>Bu modül, çekirdek"
  1169. " komutu geçersiz kılmaya çalıştı (</b><code>{}{}</code><b>)</b>\n\n<emoji"
  1170. " document_id=5472146462362048818>💡</emoji><i> Lütfen bunu hata olarak"
  1171. " bildirmeyin. Bu, Çekirdek modüllerin komutlarının değiştirilmesini"
  1172. " önlemek için bir güvenlik önlemidir.</i>"
  1173. ),
  1174. "unload_core": (
  1175. "<emoji document_id=5454225457916420314>😖</emoji> <b>Çekirdek modülleri"
  1176. " kaldıramazsınız</b> <code>{}</code><b></b>\n\n<emoji"
  1177. " document_id=5472146462362048818>💡</emoji><i> lütfen bunu hata olarak"
  1178. " bildirmeyin. Bu, Çekirdek modüllerin değiştirilmesini önlemek için"
  1179. " bir güvenlik önlemidir.</i>"
  1180. ),
  1181. "cannot_unload_lib": (
  1182. "<emoji document_id=5454225457916420314>😖</emoji> <b>Kütüphaneyi"
  1183. " kaldıramazsınız</b>"
  1184. ),
  1185. "wait_channel_approve": (
  1186. "<emoji document_id=5469741319330996757>💫</emoji> <b>Modül"
  1187. "</b> <code>{}</code> <b>kanalına katılmak için izin istiyor <a"
  1188. ' href="https://t.me/{}">{}</a>.\n\n<b><emoji'
  1189. ' document_id="5467666648263564704">❓</emoji> Sebep: {}</b>\n\n<i>Onay'
  1190. ' <a href="https://t.me/{}">bekliyor</a>...</i>'
  1191. ),
  1192. "installing": (
  1193. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Modül yükleme"
  1194. "</b> <code>{}</code><b>...</b>"
  1195. ),
  1196. "repo_exists": (
  1197. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo</b>"
  1198. " <code>{}</code> <b>zaten eklenmiş</b>"
  1199. ),
  1200. "repo_added": (
  1201. "<emoji document_id=5784993237412351403>✅</emoji> <b>Repo</b>"
  1202. " <code>{}</code> <b>eklendi</b>"
  1203. ),
  1204. "no_repo": (
  1205. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Eklemek için repo"
  1206. " belirtmeniz gerekli</b>"
  1207. ),
  1208. "repo_not_exists": (
  1209. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo</b>"
  1210. " <code>{}</code> <b>eklenmemiş</b>"
  1211. ),
  1212. "repo_deleted": (
  1213. "<emoji document_id=5784993237412351403>✅</emoji> <b>Repo</b>"
  1214. " <code>{}</code> <b>silindi</b>"
  1215. ),
  1216. }
  1217. strings_uz = {
  1218. "repo_config_doc": "Modulni yuklab olish havolasi",
  1219. "add_repo_config_doc": "Qo'shimcha omborlar",
  1220. "avail_header": "🎢 <b>Rasmiy modullarombordan</b>",
  1221. "select_preset": (
  1222. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Oldindan sozlashni"
  1223. " tanlang</b>"
  1224. ),
  1225. "no_preset": (
  1226. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Oldindan sozlash"
  1227. " topilmadi</b>"
  1228. ),
  1229. "preset_loaded": (
  1230. "<emoji document_id=5784993237412351403>✅</emoji> <b>Oldindan"
  1231. " o'rnatilgan</b>"
  1232. ),
  1233. "no_module": (
  1234. "<emoji document_id=5312526098750252863>🚫</emoji> <b>modul mavjud emas"
  1235. " omborlar</b>"
  1236. ),
  1237. "no_file": (
  1238. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Fayl topilmadi</b>"
  1239. ),
  1240. "provide_module": (
  1241. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Yuklanadigan modulni"
  1242. " belgilang</b>"
  1243. ),
  1244. "bad_unicode": (
  1245. "<emoji document_id=5312526098750252863>🚫</emoji> <b>yaroqsiz kodlash"
  1246. "modul</b>"
  1247. ),
  1248. "load_failed": (
  1249. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Yuklanmayapti"
  1250. " Muvaffaqiyatli. Jurnallarga qarang.</b>"
  1251. ),
  1252. "loaded": (
  1253. "<emoji document_id=5188377234380954537>🌘</emoji> <b>moduli"
  1254. "</b> <code>{}</code>{} <b>yuklangan {}</b>{}{}{}{}{}{}"
  1255. ),
  1256. "no_class": "<b>Unda nima yuklash kerak?</b>",
  1257. "unloaded": "{} <b>{} moduli tushirildi.</b>",
  1258. "not_loaded": (
  1259. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Modul emas"
  1260. " tushirildi.</b>"
  1261. ),
  1262. "requirements_failed": (
  1263. "<emoji document_id=5312526098750252863>🚫</emoji> <b>O'rnatish amalga"
  1264. " oshmadi bog'liqliklar</b>"
  1265. ),
  1266. "requirements_failed_termux": (
  1267. "<emoji document_id=5407025283456835913>🕶</emoji> <b>O'rnatish amalga"
  1268. " oshmadi bog'liqliklar</b>\n<b>Ko'pincha Termux bo'lmagani uchun paydo"
  1269. " bo'ladiko'p kutubxonalarni qo'llab-quvvatlaydi. Buni xato deb xabar"
  1270. " qilmang, bu tuzatib bo'lmaydi.</b>"
  1271. ),
  1272. "requirements_installing": (
  1273. "<emoji document_id=5328311576736833844>🚀</emoji> <b>O'rnatilmoqda"
  1274. " bog'liqliklar:\n\n{}</b>"
  1275. ),
  1276. "requirements_restart": (
  1277. "<emoji document_id=5875145601682771643>🚀</emoji> <b>Bog'liqlar o'rnatildi,"
  1278. " lekin qo'llash uchun qayta ishga tushirish kerak</b> <code>{}</code>"
  1279. ),
  1280. "all_modules_deleted": (
  1281. "<emoji document_id=5784993237412351403>✅</emoji> <b>Modullar olib"
  1282. " tashlandi</b>"
  1283. ),
  1284. "undoc": "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> Tavsif yo'q",
  1285. "ihandler": (
  1286. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  1287. ),
  1288. "version_incompatible": (
  1289. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ushbu modulgaHikka"
  1290. " versiyasini {}+\n</b><code>.update</code> bilan yangilashni talab qiladi"
  1291. ),
  1292. "ffmpeg_required": (
  1293. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ushbu modulga"
  1294. "o'rnatilmagan FFMPEG talab qiladi</b>"
  1295. ),
  1296. "developer": (
  1297. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Ishlab"
  1298. " chiquvchi:</b>{}"
  1299. ),
  1300. "depends_from": (
  1301. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Bog'liqlar:"
  1302. "</b>\n{}"
  1303. ),
  1304. "by": "dan",
  1305. "module_fs": (
  1306. "💿 <b>Siz modulni yuklamasligi uchun qattiq diskingizga saqlamoqchisiz"
  1307. " qayta ishga tushirishdami</b>"
  1308. ),
  1309. "save": "💿 Saqlash",
  1310. "no_save": "🚫 Kerakmas",
  1311. "save_for_all": "💽 Har vaqt saqlash",
  1312. "never_save": "🚫 Hechqachon saqlamaslik",
  1313. "will_save_fs": (
  1314. "💽 Endi fayldan yuklangan barcha modullar qattiq diskda saqlanadidisk"
  1315. ),
  1316. "inline_init_failed": (
  1317. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ushbu modulga kerak"
  1318. " HikkaInline va inline menejeri ishga tushirilmadi</b>\n<i>Sinab"
  1319. " ko'ring @BotFather'dagi eski botlardan birini o'chirib tashlang va"
  1320. " userbotni qayta yuklang</i>"
  1321. ),
  1322. "_cmd_doc_dlmod": "Modulni ombordan yuklab oling va o'rnating",
  1323. "_cmd_doc_dlpreset": "Muayyan modullar to'plamini yuklab oladi va o'rnatadi",
  1324. "_cmd_doc_loadmod": "Fayldan modulni yuklab oladi va o'rnatadi",
  1325. "_cmd_doc_unloadmod": "Modulni yuklaydi (o'chiradi)",
  1326. "_cmd_doc_clearmodules": "Barcha o'rnatilgan modullarni yuklaydi",
  1327. "_cls_doc": "Modullarni yuklaydi",
  1328. "share_link_doc": (
  1329. ".dlmod orqali yuklangandan so'ng modulga havolani taqdim eting"
  1330. ),
  1331. "modlink": (
  1332. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Havola:"
  1333. "</b><code>{}</code>"
  1334. ),
  1335. "blob_link": (
  1336. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>Modullarni"
  1337. " yuklash uchun `blob` havolalaridan foydalanmang. Bu yerdan yuklagan"
  1338. " ma`qul.`xom`</b>"
  1339. ),
  1340. "raw_link": (
  1341. "\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Havola:"
  1342. "</b><code>{}</code>"
  1343. ),
  1344. "suggest_subscribe": (
  1345. "\n\n⭐️ <b>Ushbu modul {}"
  1346. " tomonidan amalga oshirildi. Ishlab chiquvchini qo'llab-quvvatlash uchun"
  1347. " unga obuna bo'lasizmi?</b>"
  1348. ),
  1349. "subscribe": "💬 Obuna bo'lish",
  1350. "no_subscribe": "🚫 Shart emas",
  1351. "subscribed": "💬 Obuna bo'ldingiz",
  1352. "unsubscribed": "🚫 Men bu kanalga boshqa obuna bo'lishni taklif qilmayman",
  1353. "confirm_clearmodules": (
  1354. "⚠️ <b>Haqiqatan ham barcha modullarni olib tashlamoqchimisiz?</b>"
  1355. ),
  1356. "clearmodules": "🗑 modullarni tushirish",
  1357. "cancel": "🚫 Bekor qilish",
  1358. "overwrite_module": (
  1359. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ushbu modulo'rnatilgan"
  1360. " (</b><code>{}</code><b>)</b>\n\n<emojidocument_id=5472146462362048818>💡</emoji><i>"
  1361. " Bu xato emas, balki o'lchovO'rnatilgan modullarni almashtirishni oldini"
  1362. " olish uchun zarur bo'lgan xavfsizlik Har xil keraksiz narsalar bilan. Bu"
  1363. " haqda qo'llab-quvvatlash chatida xabar bermang</i>"
  1364. ),
  1365. "overwrite_command": (
  1366. "<emoji document_id=5454225457916420314>😖</emoji> <b>Ushbu modulo'rnatilgan"
  1367. " buyruqni qayta yozishga harakat qildim"
  1368. " (</b><code>{}</code><b>)</b>\n\n<emojidocument_id=5472146462362048818>💡</emoji><i>"
  1369. " Bu xato emas, balki o'lchovO'rnatilgan buyruqlarni almashtirishni oldini"
  1370. " olish uchun zarur bo'lgan xavfsizlik har xil keraksiz narsalarga ega"
  1371. " modullar. Bu haqda qo'llab-quvvatlash chatida xabar bermang</i>"
  1372. ),
  1373. "unload_core": (
  1374. "<emoji document_id=5454225457916420314>😖</emoji> <b>Siz qila olmaysiz"
  1375. " o'rnatilgan modulni yuklash</b>"
  1376. " <code>{}</code><b></b>\n\n<emojidocument_id=5472146462362048818>💡</emoji><i>"
  1377. " Bu xato emas, balki o'lchovO'rnatilgan modullarni almashtirishni oldini"
  1378. " olish uchun zarur bo'lgan xavfsizlik Har xil keraksiz narsalar bilan. Bu"
  1379. " haqda qo'llab-quvvatlash chatida xabar bermang</i>"
  1380. ),
  1381. "cannot_unload_lib": (
  1382. "<emoji document_id=5454225457916420314>😖</emoji> <b>Siz qila olmaysiz"
  1383. " kutubxonani olib tashlash</b>"
  1384. ),
  1385. "wait_channel_approve": (
  1386. "<emoji document_id=5469741319330996757>💫</emoji> <b>Modul"
  1387. "</b> <code>{}</code> <b>kanaliga qo'shilish uchun ruxsat so'ramoqda <a"
  1388. ' href="https://t.me/{}">{}</a>.\n\n<b><emoji'
  1389. ' document_id="5467666648263564704">❓</emoji> Sabab:'
  1390. ' {}</b>\n\n<i><a href="https://t.me/{}">tasdiqlash</a> kutilmoqda...</i>'
  1391. ),
  1392. "installing": (
  1393. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Modulni o'rnatish"
  1394. "</b> <code>{}</code><b>...</b>"
  1395. ),
  1396. "repo_exists": (
  1397. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo</b>"
  1398. " <code>{}</code> <b>aldaqqa qo'shilgan</b>"
  1399. ),
  1400. "repo_added": (
  1401. "<emoji document_id=5784993237412351403>✅</emoji> <b>Repo</b>"
  1402. " <code>{}</code> <b>qo'shildi</b>"
  1403. ),
  1404. "no_repo": (
  1405. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo qo'shish uchun"
  1406. " sizga kerak</b>"
  1407. ),
  1408. "repo_not_exists": (
  1409. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Repo</b>"
  1410. " <code>{}</code> <b>qo'shilmagan</b>"
  1411. ),
  1412. "repo_deleted": (
  1413. "<emoji document_id=5784993237412351403>✅</emoji> <b>Repo</b>"
  1414. " <code>{}</code> <b>o'chirildi</b>"
  1415. ),
  1416. }
  1417. strings_es = {
  1418. "repo_config_doc": "Enlace al repositorio de módulos",
  1419. "avail_header": "🎢 <b>Módulos del repositorio</b>",
  1420. "select_preset": (
  1421. "<b>⚠️ Por favor, selecciona una configuración preestablecida</b>"
  1422. ),
  1423. "no_preset": (
  1424. "<emoji document_id=5312526098750252863>🚫</emoji> <b>No se encontraron"
  1425. " configuraciones preestablecidas</b>"
  1426. ),
  1427. "preset_loaded": (
  1428. "<emoji document_id=5784993237412351403>✅</emoji> <b>Configuración"
  1429. " preestablecida cargada</b>"
  1430. ),
  1431. "no_module": (
  1432. "<emoji document_id=5312526098750252863>🚫</emoji> <b>No se encontró el"
  1433. " módulo en el repositorio.</b>"
  1434. ),
  1435. "no_file": (
  1436. "<emoji document_id=5312526098750252863>🚫</emoji> <b>No se encontró el"
  1437. " archivo</b>"
  1438. ),
  1439. "provide_module": (
  1440. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Proporcione el módulo"
  1441. " para cargarlo</b>"
  1442. ),
  1443. "bad_unicode": (
  1444. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Formato de módulo"
  1445. " unicode inválido</b>"
  1446. ),
  1447. "load_failed": (
  1448. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Falló la carga. Revise"
  1449. " el registro para obtener más detalles.</b>"
  1450. ),
  1451. "loaded": (
  1452. "<emoji document_id=5784993237412351403>✅</emoji> <b>El módulo"
  1453. "</b> <code>{}</code>{} <b>cargado en {}</b>{}{}{}{}{}{}"
  1454. ),
  1455. "no_class": "<b>¿Qué clase desea deshabilitar?</b>",
  1456. "unloaded": "{} <b>Módulo {} descargado.</b>",
  1457. "not_unloaded": (
  1458. "<emoji document_id=5312526098750252863>🚫</emoji> <b>El módulo no se"
  1459. " descargó.</b>"
  1460. ),
  1461. "requirements_failed": (
  1462. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Falló la instalación"
  1463. " de requisitos</b>"
  1464. ),
  1465. "requirements_failed_termux": (
  1466. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Falló la instalación"
  1467. " de requisitos</b>\n<b>El motivo más común es que Termux no esté"
  1468. " instalado, que es el que soporta la mayoría de las bibliotecas. No lo"
  1469. " informe como un error, no se puede resolver.</b>"
  1470. ),
  1471. "requirements_installing": (
  1472. "<emoji document_id=5328311576736833844>🚀</emoji> <b>Instalando"
  1473. " requerimientos:\n\n{}</b>"
  1474. ),
  1475. "requirements_restart": (
  1476. "<emoji document_id=5875145601682771643>🚀</emoji> <b>Requerimientos"
  1477. " instalados, pero es necesario reiniciar</b> <code>{}</code> <b>para"
  1478. " completar la operación.</b>"
  1479. ),
  1480. "all_modules_deleted": (
  1481. "<emoji document_id=5784993237412351403>✅</emoji> <b>Todos los"
  1482. " módulos eliminados</b>"
  1483. ),
  1484. "undoc": (
  1485. "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> Sin documentación"
  1486. ),
  1487. "ihandler": (
  1488. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  1489. ),
  1490. "inline_init_failed": (
  1491. "<emoji document_id=5454225457916420314>😖</emoji> <b>Este módulo"
  1492. " requiere la existencia de Hikka inline y falló"
  1493. " inicializar InlineManager</b>\n<i>Elimina uno de los bots anteriores de"
  1494. " @BotFather y reinicia el bot para cargar este módulo.</i>"
  1495. ),
  1496. "version_incompatible": (
  1497. "<emoji document_id=5454225457916420314>😖</emoji> <b>Este módulo"
  1498. " requiere Hikka {}+\nPor favor,</b> <code>.update</code> para actualizar."
  1499. ),
  1500. "ffmpeg_required": (
  1501. "<emoji document_id=5454225457916420314>😖</emoji> <b>Este módulo"
  1502. " requiere FFMPEG, no está instalado</b>"
  1503. ),
  1504. "developer": (
  1505. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Desarrollador:"
  1506. "</b> {}"
  1507. ),
  1508. "depends_from": (
  1509. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Depende de:"
  1510. "</b> \n{}"
  1511. ),
  1512. "by": "por",
  1513. "module_fs": (
  1514. "💿 <b>¿Quieres guardar este módulo en el sistema de archivos? Será"
  1515. " eliminado al reiniciar y desinstalarlo.</b>"
  1516. ),
  1517. "save": "💿 Guardar",
  1518. "no_save": "🚫 No guardar",
  1519. "save_for_all": "💽 Guardar todos los módulos en el sistema de archivos",
  1520. "never_save": "🚫 No guardar todos los módulos en el sistema de archivos",
  1521. "will_save_fs": (
  1522. "💽 Ahora se guardarán todos los módulos cargados por .loadmod en el"
  1523. " sistema de archivos."
  1524. ),
  1525. "add_repo_config_doc": "Repositorio adicional para descargar desde él",
  1526. "share_link_doc": "Compartir enlace de descarga de .dlmod",
  1527. "modlink": (
  1528. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Enlace:"
  1529. "</b> <code>{}</code>"
  1530. ),
  1531. "blob_link": (
  1532. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>No uses enlaces"
  1533. " `blob` para descargar módulos. Usa `raw` en cambio</b>"
  1534. ),
  1535. "suggest_subscribe": (
  1536. "\n\n⭐️ <b>Este módulo"
  1537. " fue creado por: {}. ¿Quieres suscribirte a este canal para apoyar al"
  1538. " desarrollador?</b>"
  1539. ),
  1540. "subscribe": "💬 Suscribirse",
  1541. "no_subscribe": "🚫 No quiero suscribirme",
  1542. "subscribed": "💬 Suscribirse",
  1543. "not_subscribed": (
  1544. "🚫 No se han enviado sugerencias de suscripción a este canal todavía."
  1545. ),
  1546. "confirm_clearmodules": (
  1547. "⚠️ <b>¿Realmente quieres borrar todos los módulos?</b>"
  1548. ),
  1549. "clearmodules": "🗑 Borrar módulos",
  1550. "cancel": "🚫 Cancelar",
  1551. "overwrite_module": (
  1552. "<emoji document_id=5454225457916420314>😖</emoji> <b>Intentaste redefinir"
  1553. " el código base del módulo (</b><code>{}</code><b>)</b>.\n\n<emoji"
  1554. " document_id=5472146462362048818>💡</emoji><i> No informes de este error"
  1555. " como un error. Esta es una característica de seguridad para evitar que se"
  1556. " reemplace el código base de los módulos"
  1557. " basura</i>"
  1558. ),
  1559. "overwrite_command": (
  1560. "<emoji document_id=5454225457916420314>😖</emoji> <b>Intentaste redefinir"
  1561. " este comando base (</b><code>{}{}</code><b>)</b>\n\n<emoji"
  1562. " document_id=5472146462362048818>💡</emoji><i> No informes de este error"
  1563. " como un error. Este es el código base del comando"
  1564. " basura</i>"
  1565. ),
  1566. "unload_core": (
  1567. "<emoji document_id=5454225457916420314>😖</emoji> <b>No se puede"
  1568. " desactivar. módulo base</b> <code>{}</code><b></b>\n\n<emoji"
  1569. " document_id=5472146462362048818>💡</emoji><i> No informes de este error"
  1570. " como un error. Este es un módulo base que no se puede basura</i>"
  1571. ),
  1572. "cannot_unload_lib": (
  1573. "<emoji document_id=5454225457916420314>😖</emoji> <b>No se puede"
  1574. " desactivar. biblioteca</b>"
  1575. ),
  1576. "wait_channel_approve": (
  1577. "<emoji document_id=5469741319330996757>💫</emoji> <b>El módulo"
  1578. "</b> <code>{}</code> <b>solicita permiso para unirse al canal <a"
  1579. ' href="https://t.me/{}">{}</a>.\n\n<b><emoji'
  1580. ' document_id="5467666648263564704">❓</emoji> Motivo: {}</b>\n\n<i>Espera'
  1581. ' <a href="https://t.me/{}">aprobación</a>...</i>'
  1582. ),
  1583. "installing": (
  1584. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Módulo de instalación"
  1585. "</b> <code>{}</code><b>...</b>"
  1586. ),
  1587. "repo_exists": (
  1588. "<emoji document_id=5312526098750252863>🚫</emoji> <b>El repositorio</b>"
  1589. " <code>{}</code> <b>ya ha sido añadido</b>"
  1590. ),
  1591. "repo_added": (
  1592. "<emoji document_id=5784993237412351403>✅</emoji> <b>El repositorio</b>"
  1593. " <code>{}</code> <b>ha sido añadido</b>"
  1594. ),
  1595. "no_repo": (
  1596. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Necesitas especificar"
  1597. " el repositorio a añadir</b>"
  1598. ),
  1599. "repo_not_exists": (
  1600. "<emoji document_id=5312526098750252863>🚫</emoji> <b>El repositorio</b>"
  1601. " <code>{}</code> <b>no ha sido añadido</b>"
  1602. ),
  1603. "repo_deleted": (
  1604. "<emoji document_id=5784993237412351403>✅</emoji> <b>El repositorio</b>"
  1605. " <code>{}</code> <b>ha sido eliminado</b>"
  1606. ),
  1607. }
  1608. strings_kk = {
  1609. "repo_config_doc": "Модульдерді жүктеу үшін сілтеме",
  1610. "add_repo_config_doc": "Қосымша қоры",
  1611. "avail_header": "🎢 <b>Репозиториядан қолданылатын официалды модульдер</b>",
  1612. "select_preset": (
  1613. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Пресетті таңда</b>"
  1614. ),
  1615. "no_preset": (
  1616. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Пресет табылмады</b>"
  1617. ),
  1618. "preset_loaded": (
  1619. "<emoji document_id=5784993237412351403>✅</emoji> <b>Пресет жүктелді</b>"
  1620. ),
  1621. "no_module": (
  1622. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Репозиторияда модуль"
  1623. " жоқ.</b>"
  1624. ),
  1625. "no_file": (
  1626. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Файл табылмады</b>"
  1627. ),
  1628. "provide_module": (
  1629. "<emoji document_id=5312383351217201533>⚠️</emoji> <b>Жүктелетін модульді"
  1630. " көрсет</b>"
  1631. ),
  1632. "bad_unicode": (
  1633. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Модульдің"
  1634. " кодировкасы дұрыс емес</b>"
  1635. ),
  1636. "load_failed": (
  1637. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Жүктелу сәтсіз"
  1638. " аяқталды. Журналдарды қараңыз.</b>"
  1639. ),
  1640. "loaded": (
  1641. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Модуль"
  1642. "</b> <code>{}</code>{} <b>жүктелді {}</b>{}{}{}{}{}{}"
  1643. ),
  1644. "unloaded": "{} <b>Модуль {} аяқталды.</b>",
  1645. "not_unloaded": (
  1646. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Модуль аяқталған"
  1647. " жоқ.</b>"
  1648. ),
  1649. "requirements_failed": (
  1650. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Талаптарды орнату"
  1651. " сәтсіз аяқталды</b>"
  1652. ),
  1653. "requirements_failed_termux": (
  1654. "<emoji document_id=5407025283456835913>🕶</emoji> <b>Талаптарды орнату"
  1655. " сәтсіз аяқталды</b>\n<b>Бұл тұтынуы қызметінде Termux қолдау көрсетуге"
  1656. " мүмкін емес бірнеше кітапханаларды қолданады. Осындай тұтынуын"
  1657. " жібермеңіз, бүгін олдынайғы өзгертілмейді.</b>"
  1658. ),
  1659. "requirements_installing": (
  1660. "<emoji document_id=5328311576736833844>🚀</emoji> <b>Зависимостерді"
  1661. " орнатуда:\n\n{}</b>"
  1662. ),
  1663. "requirements_restart": (
  1664. "<emoji document_id=5875145601682771643>🚀</emoji> <b>Зависимостер"
  1665. " орнатылды, бірақ</b> <code>{}</code> <b>үшін қайта іске қосу"
  1666. " керек</b>"
  1667. ),
  1668. "all_modules_deleted": (
  1669. "<emoji document_id=5784993237412351403>✅</emoji> <b>Барлық модульдер"
  1670. " жойылды</b>"
  1671. ),
  1672. "undoc": "<emoji document_id=5427052514094619126>🤷‍♀️</emoji> Сипаттама жоқ",
  1673. "ihandler": (
  1674. "\n<emoji document_id=5372981976804366741>🤖</emoji> <code>{}</code> {}"
  1675. ),
  1676. "version_incompatible": (
  1677. "<emoji document_id=5454225457916420314>😖</emoji> <b>Бұл модульге"
  1678. " Hikka {}+ туралы\n</b><code>.update</code> <b>коммандасын"
  1679. " пайдаланып жаңартыңыз</b>"
  1680. ),
  1681. "ffmpeg_required": (
  1682. "<emoji document_id=5454225457916420314>😖</emoji> <b>Бұл модульге"
  1683. " FFMPEG керек, бірақ орнатылмаған</b>"
  1684. ),
  1685. "developer": (
  1686. "\n\n<emoji document_id=5875452644599795072>🫶</emoji> <b>Әзірлеуші:</b> {}"
  1687. ),
  1688. "depends_from": (
  1689. "\n\n<emoji document_id=5431736674147114227>📦</emoji> <b>Сыртқылар:"
  1690. "</b> \n{}"
  1691. ),
  1692. "by": "кімнен",
  1693. "module_fs": (
  1694. "💿 <b>Сіз модульді жүктеудің кездесуін қалай болса, сіз оны жүктеп жинауға"
  1695. " боладыңыз ба?</b>"
  1696. ),
  1697. "save": "💿 Сақтау",
  1698. "no_save": "🚫 Сақтау",
  1699. "save_for_all": "💽 Барлығында сақтау",
  1700. "never_save": "🚫 Ешқашан сақтау",
  1701. "will_save_fs": (
  1702. "💽 Бұл уақыттан бастап, барлық файлдан жүктелген модульдер жүктеп жиналады"
  1703. ),
  1704. "inline_init_failed": (
  1705. "<emoji document_id=5454225457916420314>😖</emoji> <b>Бұл модульде"
  1706. " HikkaInline талап етіледі, бірақ ондың инициализациясы"
  1707. " ұмытты</b>\n<i>Ескі боттарды @BotFather-дан жоюға және ботты қайта"
  1708. " жүктеуіңізді ұсыныңыз</i>"
  1709. ),
  1710. "_cmd_doc_dlmod": "Репозиториянан модульді жүктеу және орнату",
  1711. "_cmd_doc_dlpreset": "Белгіленген нұсқа модулдерді жүктеу және орнату",
  1712. "_cmd_doc_loadmod": "Файлдан модульді жүктеу және орнату",
  1713. "_cmd_doc_unloadmod": "Модульді жою",
  1714. "_cmd_doc_clearmodules": "Барлық орнатылған модульді жою",
  1715. "_cls_doc": "Модульді жүктеу",
  1716. "share_link_doc": (
  1717. ".dlmod командасынан модульді жүктеуден кейін модульдің сілтемесін көрсету"
  1718. ),
  1719. "modlink": (
  1720. "\n\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Сілтеме:"
  1721. "</b> <code>{}</code>"
  1722. ),
  1723. "blob_link": (
  1724. "\n\n<emoji document_id=5312383351217201533>⚠️</emoji> <b>`blob` сілтемесін"
  1725. " модульді жүктеу үшін пайдаланбаңыз. `raw` сілтемесін пайдалануға"
  1726. " болады</b>"
  1727. ),
  1728. "raw_link": (
  1729. "\n<emoji document_id=6037284117505116849>🌐</emoji> <b>Сілтеме:"
  1730. "</b> <code>{}</code>"
  1731. ),
  1732. "suggest_subscribe": (
  1733. "\n\n⭐️ <b>Бұл модуль {} жасады. Әкімшіге және модульдің жасаушысына қолдау"
  1734. " үшін жазылыңыз ба?</b>"
  1735. ),
  1736. "subscribe": "💬 Бақылау",
  1737. "no_subscribe": "🚫 Бақыламау",
  1738. "subscribed": "💬 Бақылдым!",
  1739. "unsubscribed": "🚫 Мен бұл каналға бақыламаймын",
  1740. "confirm_clearmodules": "⚠️ <b>Барлық модульдерді жоюға сенімдісіз бе?</b>",
  1741. "clearmodules": "🗑 Модульдерді жою",
  1742. "cancel": "🚫 Болдырмау",
  1743. "overwrite_module": (
  1744. "<emoji document_id=5454225457916420314>😖</emoji> <b>Бұл модуль қосымша"
  1745. " модульдің жоғарғы бетін өзгертті (</b><code>{}</code><b>)</b>\n\n<emoji"
  1746. " document_id=5472146462362048818>💡</emoji><i> Бұл қате емес, бұл құрамын"
  1747. " қорғау үшін тиіс, қосымша модульдерді құрамын өзгерткенде қосымша"
  1748. " модульдердің құрамын құрмасы үшін керек. Сұраныс чатына хабарламаңызды"
  1749. " жібермеңізді сұраймыз</i>"
  1750. ),
  1751. "overwrite_command": (
  1752. "<emoji document_id=5454225457916420314>😖</emoji> <b>Бұл модуль қосымша"
  1753. " модульдің командасын өзгертті (</b><code>{}</code><b>)</b>\n\n<emoji"
  1754. " document_id=5472146462362048818>💡</emoji><i> Бұл қате емес, бұл құрамын"
  1755. " қорғау үшін тиіс, қосымша модульдерді құрамын өзгерткенде қосымша"
  1756. " модульдердің құрамын құрмасы үшін керек. Сұраныс чатына хабарламаңызды"
  1757. " жібермеңізді сұраймыз</i>"
  1758. ),
  1759. "unload_core": (
  1760. "<emoji document_id=5454225457916420314>😖</emoji> <b>Сіз бастапқы"
  1761. " модульді жоюға болмайсыз</b> <code>{}</code><b></b>\n\n<emoji"
  1762. " document_id=5472146462362048818>💡</emoji><i> Бұл қате емес, ал құралдар"
  1763. " қорғасын тұрақты жоғарыластыру үшін қажет. Бұл хабарламаны support"
  1764. " чатына жібермеңіз</i>"
  1765. ),
  1766. "cannot_unload_lib": (
  1767. "<emoji document_id=5454225457916420314>😖</emoji> <b>Сіз біблиотеканы"
  1768. " жоюға болмайсыз</b>"
  1769. ),
  1770. "wait_channel_approve": (
  1771. "<emoji document_id=5469741319330996757>💫</emoji> <b>Модуль"
  1772. "</b> <code>{}</code> <b>жүйеге қосылуы үшін <a"
  1773. ' href="https://t.me/{}">{}</a> каналына кіруге рұқсат беру үшін сұраныс'
  1774. ' жіберген.\n\n<b><emoji document_id="5467666648263564704">❓</emoji>'
  1775. " Себебі: {}</b>\n\n<i>Рұқсат беру үшін <a"
  1776. ' href="https://t.me/{}">күтіңіз</a>...</i>'
  1777. ),
  1778. "installing": (
  1779. "<emoji document_id=5325792861885570739>🕔</emoji> <b>Модульді орнату"
  1780. "</b> <code>{}</code><b>...</b>"
  1781. ),
  1782. "repo_exists": (
  1783. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Репозиторий</b>"
  1784. " <code>{}</code> <b>іске қосылған</b>"
  1785. ),
  1786. "repo_added": (
  1787. "<emoji document_id=5784993237412351403>✅</emoji> <b>Репозиторий</b>"
  1788. " <code>{}</code> <b>қосылды</b>"
  1789. ),
  1790. "no_repo": (
  1791. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Қосу үшін repo"
  1792. " белгілеуіңіз керек</b>"
  1793. ),
  1794. "repo_not_exists": (
  1795. "<emoji document_id=5312526098750252863>🚫</emoji> <b>Репозиторий</b>"
  1796. " <code>{}</code> <b>қосылмаған</b>"
  1797. ),
  1798. "repo_deleted": (
  1799. "<emoji document_id=5784993237412351403>✅</emoji> <b>Репозиторий</b>"
  1800. " <code>{}</code> <b>жойылды</b>"
  1801. ),
  1802. }
  1803. fully_loaded = False
  1804. _links_cache = {}
  1805. def __init__(self):
  1806. self._storage = RemoteStorage()
  1807. self.config = loader.ModuleConfig(
  1808. loader.ConfigValue(
  1809. "MODULES_REPO",
  1810. "https://mods.hikariatama.ru",
  1811. lambda: self.strings("repo_config_doc"),
  1812. validator=loader.validators.Link(),
  1813. ),
  1814. loader.ConfigValue(
  1815. "ADDITIONAL_REPOS",
  1816. # Currenly the trusted developers are specified
  1817. [
  1818. "https://github.com/hikariatama/host/raw/master",
  1819. "https://github.com/MoriSummerz/ftg-mods/raw/main",
  1820. "https://gitlab.com/CakesTwix/friendly-userbot-modules/-/raw/master",
  1821. ],
  1822. lambda: self.strings("add_repo_config_doc"),
  1823. validator=loader.validators.Series(validator=loader.validators.Link()),
  1824. ),
  1825. loader.ConfigValue(
  1826. "share_link",
  1827. doc=lambda: self.strings("share_link_doc"),
  1828. validator=loader.validators.Boolean(),
  1829. ),
  1830. )
  1831. async def _async_init(self):
  1832. modules = list(
  1833. filter(
  1834. lambda x: not x.startswith("https://mods.hikariatama.ru"),
  1835. utils.array_sum(
  1836. map(
  1837. lambda x: list(x.values()),
  1838. (await self.get_repo_list("full")).values(),
  1839. )
  1840. ),
  1841. )
  1842. )
  1843. logger.debug("Modules: %s", modules)
  1844. asyncio.ensure_future(self._storage.preload(modules))
  1845. asyncio.ensure_future(self._storage.preload_main_repo())
  1846. async def client_ready(self):
  1847. self._token_msg = (await self._client.get_messages("@hikka_ub", ids=[10]))[0]
  1848. self.allmodules.add_aliases(self.lookup("settings").get("aliases", {}))
  1849. main.hikka.ready.set()
  1850. asyncio.ensure_future(self._update_modules())
  1851. asyncio.ensure_future(self._async_init())
  1852. @loader.loop(interval=3, wait_before=True, autostart=True)
  1853. async def _config_autosaver(self):
  1854. for mod in self.allmodules.modules:
  1855. if (
  1856. not hasattr(mod, "config")
  1857. or not mod.config
  1858. or not isinstance(mod.config, loader.ModuleConfig)
  1859. ):
  1860. continue
  1861. for option, config in mod.config._config.items():
  1862. if not hasattr(config, "_save_marker"):
  1863. continue
  1864. delattr(mod.config._config[option], "_save_marker")
  1865. mod.pointer("__config__", {})[option] = config.value
  1866. for lib in self.allmodules.libraries:
  1867. if (
  1868. not hasattr(lib, "config")
  1869. or not lib.config
  1870. or not isinstance(lib.config, loader.ModuleConfig)
  1871. ):
  1872. continue
  1873. for option, config in lib.config._config.items():
  1874. if not hasattr(config, "_save_marker"):
  1875. continue
  1876. delattr(lib.config._config[option], "_save_marker")
  1877. lib._lib_pointer("__config__", {})[option] = config.value
  1878. self._db.save()
  1879. def update_modules_in_db(self):
  1880. if self.allmodules.secure_boot:
  1881. return
  1882. self.set(
  1883. "loaded_modules",
  1884. {
  1885. **{
  1886. module.__class__.__name__: module.__origin__
  1887. for module in self.allmodules.modules
  1888. if module.__origin__.startswith("http")
  1889. },
  1890. **{
  1891. module.name: module.url
  1892. for module in self.allmodules.dragon_modules
  1893. if module.url
  1894. },
  1895. },
  1896. )
  1897. @loader.owner
  1898. @loader.command(
  1899. ru_doc="Загрузить модуль из официального репозитория",
  1900. fr_doc="Charge un module depuis le dépôt officiel",
  1901. it_doc="Carica un modulo dal repository ufficiale",
  1902. de_doc="Lade ein Modul aus dem offiziellen Repository",
  1903. tr_doc="Resmi depodan bir modül yükler",
  1904. uz_doc="Ofitsial repodan modulni yuklash",
  1905. es_doc="Cargar un módulo desde el repositorio oficial",
  1906. kk_doc="Официалдық репозиториянан модульді жүктеу",
  1907. alias="dlm",
  1908. )
  1909. async def dlmod(self, message: Message):
  1910. """Install a module from the official module repo"""
  1911. if args := utils.get_args(message):
  1912. args = args[0]
  1913. await self.download_and_install(args, message)
  1914. if self.fully_loaded:
  1915. self.update_modules_in_db()
  1916. else:
  1917. await self.inline.list(
  1918. message,
  1919. [
  1920. self.strings("avail_header")
  1921. + f"\n☁️ {repo.strip('/')}\n\n"
  1922. + "\n".join(
  1923. [
  1924. " | ".join(chunk)
  1925. for chunk in utils.chunks(
  1926. [
  1927. f"<code>{i}</code>"
  1928. for i in sorted(
  1929. [
  1930. utils.escape_html(
  1931. i.split("/")[-1].split(".")[0]
  1932. )
  1933. for i in mods.values()
  1934. ]
  1935. )
  1936. ],
  1937. 5,
  1938. )
  1939. ]
  1940. )
  1941. for repo, mods in (await self.get_repo_list("full")).items()
  1942. ],
  1943. )
  1944. @loader.owner
  1945. @loader.command(
  1946. ru_doc="Установить пресет модулей",
  1947. fr_doc="Installe un preset de modules",
  1948. it_doc="Installa un preset di moduli",
  1949. de_doc="Installiere ein Modul-Preset",
  1950. tr_doc="Modül önbelleğini yükle",
  1951. uz_doc="Modul presetini o'rnatish",
  1952. es_doc="Instalar un conjunto de módulos",
  1953. kk_doc="Модульдің пресетін орнату",
  1954. )
  1955. async def dlpreset(self, message: Message):
  1956. """Set modules preset"""
  1957. args = utils.get_args(message)
  1958. if not args:
  1959. await utils.answer(message, self.strings("select_preset"))
  1960. return
  1961. await self.get_repo_list(args[0])
  1962. self.set("chosen_preset", args[0])
  1963. await utils.answer(message, self.strings("preset_loaded"))
  1964. await self.invoke("restart", "-f", message=message)
  1965. async def _get_modules_to_load(self):
  1966. preset = self.get("chosen_preset")
  1967. if preset != "disable":
  1968. possible_mods = (
  1969. await self.get_repo_list(preset, only_primary=True)
  1970. ).values()
  1971. todo = dict(ChainMap(*possible_mods))
  1972. else:
  1973. todo = {}
  1974. todo.update(**self.get("loaded_modules", {}))
  1975. logger.debug("Loading modules: %s", todo)
  1976. return todo
  1977. async def _get_repo(self, repo: str, preset: str) -> str:
  1978. repo = repo.strip("/")
  1979. preset_id = f"{repo}/{preset}"
  1980. if self._links_cache.get(preset_id, {}).get("exp", 0) >= time.time():
  1981. return self._links_cache[preset_id]["data"]
  1982. res = await utils.run_sync(
  1983. requests.get,
  1984. f"{repo}/{preset}.txt",
  1985. )
  1986. if not str(res.status_code).startswith("2"):
  1987. logger.debug(
  1988. "Can't load repo %s, preset %s because of %s status code",
  1989. repo,
  1990. preset,
  1991. res.status_code,
  1992. )
  1993. return []
  1994. self._links_cache[preset_id] = {
  1995. "exp": time.time() + 5 * 60,
  1996. "data": [link for link in res.text.strip().splitlines() if link],
  1997. }
  1998. return self._links_cache[preset_id]["data"]
  1999. async def get_repo_list(
  2000. self,
  2001. preset: typing.Optional[str] = None,
  2002. only_primary: bool = False,
  2003. ) -> dict:
  2004. if preset is None or preset == "none":
  2005. preset = "minimal"
  2006. return {
  2007. repo: {
  2008. f"Mod/{repo_id}/{i}": f'{repo.strip("/")}/{link}.py'
  2009. for i, link in enumerate(set(await self._get_repo(repo, preset)))
  2010. }
  2011. for repo_id, repo in enumerate(
  2012. [self.config["MODULES_REPO"]]
  2013. + ([] if only_primary else self.config["ADDITIONAL_REPOS"])
  2014. )
  2015. if repo.startswith("http")
  2016. }
  2017. async def get_links_list(self) -> typing.List[str]:
  2018. links = await self.get_repo_list("full")
  2019. main_repo = list(links.pop(self.config["MODULES_REPO"]).values())
  2020. return main_repo + list(dict(ChainMap(*list(links.values()))).values())
  2021. async def _find_link(self, module_name: str) -> typing.Union[str, bool]:
  2022. return next(
  2023. filter(
  2024. lambda link: link.lower().endswith(f"/{module_name.lower()}.py"),
  2025. await self.get_links_list(),
  2026. ),
  2027. False,
  2028. )
  2029. async def download_and_install(
  2030. self,
  2031. module_name: str,
  2032. message: typing.Optional[Message] = None,
  2033. ):
  2034. try:
  2035. blob_link = False
  2036. module_name = module_name.strip()
  2037. if urlparse(module_name).netloc:
  2038. url = module_name
  2039. if re.match(
  2040. r"^(https:\/\/github\.com\/.*?\/.*?\/blob\/.*\.py)|"
  2041. r"(https:\/\/gitlab\.com\/.*?\/.*?\/-\/blob\/.*\.py)$",
  2042. url,
  2043. ):
  2044. url = url.replace("/blob/", "/raw/")
  2045. blob_link = True
  2046. else:
  2047. url = await self._find_link(module_name)
  2048. if not url:
  2049. if message is not None:
  2050. await utils.answer(message, self.strings("no_module"))
  2051. return False
  2052. if message:
  2053. message = await utils.answer(
  2054. message,
  2055. self.strings("installing").format(module_name),
  2056. )
  2057. try:
  2058. r = await self._storage.fetch(url)
  2059. except requests.exceptions.HTTPError:
  2060. if message is not None:
  2061. await utils.answer(message, self.strings("no_module"))
  2062. return False
  2063. return await self.load_module(
  2064. r,
  2065. message,
  2066. module_name,
  2067. url,
  2068. blob_link=blob_link,
  2069. )
  2070. except Exception:
  2071. logger.exception("Failed to load %s", module_name)
  2072. async def _inline__load(
  2073. self,
  2074. call: InlineCall,
  2075. doc: str,
  2076. path_: str,
  2077. mode: str,
  2078. ):
  2079. save = False
  2080. if mode == "all_yes":
  2081. self._db.set(main.__name__, "permanent_modules_fs", True)
  2082. self._db.set(main.__name__, "disable_modules_fs", False)
  2083. await call.answer(self.strings("will_save_fs"))
  2084. save = True
  2085. elif mode == "all_no":
  2086. self._db.set(main.__name__, "disable_modules_fs", True)
  2087. self._db.set(main.__name__, "permanent_modules_fs", False)
  2088. elif mode == "once":
  2089. save = True
  2090. await self.load_module(doc, call, origin=path_ or "<string>", save_fs=save)
  2091. @loader.owner
  2092. @loader.command(
  2093. ru_doc="Загрузить модуль из файла",
  2094. fr_doc="Charge un module depuis un fichier",
  2095. it_doc="Carica un modulo da un file",
  2096. de_doc="Lade Modul aus Datei",
  2097. tr_doc="Dosyadan modül yükle",
  2098. uz_doc="Fayldan modulni yuklash",
  2099. es_doc="Cargar módulo desde archivo",
  2100. kk_doc="Файлдан модульді жүктеу",
  2101. alias="lm",
  2102. )
  2103. async def loadmod(self, message: Message):
  2104. """Loads the module file"""
  2105. msg = message if message.file else (await message.get_reply_message())
  2106. if msg is None or msg.media is None:
  2107. await utils.answer(message, self.strings("provide_module"))
  2108. return
  2109. path_ = None
  2110. doc = await msg.download_media(bytes)
  2111. logger.debug("Loading external module...")
  2112. try:
  2113. doc = doc.decode("utf-8")
  2114. except UnicodeDecodeError:
  2115. await utils.answer(message, self.strings("bad_unicode"))
  2116. return
  2117. if not self._db.get(
  2118. main.__name__,
  2119. "disable_modules_fs",
  2120. False,
  2121. ) and not self._db.get(main.__name__, "permanent_modules_fs", False):
  2122. if message.file:
  2123. await message.edit("")
  2124. message = await message.respond("🌘", reply_to=utils.get_topic(message))
  2125. if await self.inline.form(
  2126. self.strings("module_fs"),
  2127. message=message,
  2128. reply_markup=[
  2129. [
  2130. {
  2131. "text": self.strings("save"),
  2132. "callback": self._inline__load,
  2133. "args": (doc, path_, "once"),
  2134. },
  2135. {
  2136. "text": self.strings("no_save"),
  2137. "callback": self._inline__load,
  2138. "args": (doc, path_, "no"),
  2139. },
  2140. ],
  2141. [
  2142. {
  2143. "text": self.strings("save_for_all"),
  2144. "callback": self._inline__load,
  2145. "args": (doc, path_, "all_yes"),
  2146. }
  2147. ],
  2148. [
  2149. {
  2150. "text": self.strings("never_save"),
  2151. "callback": self._inline__load,
  2152. "args": (doc, path_, "all_no"),
  2153. }
  2154. ],
  2155. ],
  2156. ):
  2157. return
  2158. if path_ is not None:
  2159. await self.load_module(
  2160. doc,
  2161. message,
  2162. origin=path_,
  2163. save_fs=self._db.get(main.__name__, "permanent_modules_fs", False)
  2164. and not self._db.get(main.__name__, "disable_modules_fs", False),
  2165. )
  2166. else:
  2167. await self.load_module(
  2168. doc,
  2169. message,
  2170. save_fs=self._db.get(main.__name__, "permanent_modules_fs", False)
  2171. and not self._db.get(main.__name__, "disable_modules_fs", False),
  2172. )
  2173. async def load_module(
  2174. self,
  2175. doc: str,
  2176. message: Message,
  2177. name: typing.Optional[str] = None,
  2178. origin: str = "<string>",
  2179. did_requirements: bool = False,
  2180. save_fs: bool = False,
  2181. blob_link: bool = False,
  2182. ):
  2183. if any(
  2184. line.replace(" ", "") == "#scope:ffmpeg" for line in doc.splitlines()
  2185. ) and os.system("ffmpeg -version 1>/dev/null 2>/dev/null"):
  2186. if isinstance(message, Message):
  2187. await utils.answer(message, self.strings("ffmpeg_required"))
  2188. return
  2189. if (
  2190. any(line.replace(" ", "") == "#scope:inline" for line in doc.splitlines())
  2191. and not self.inline.init_complete
  2192. ):
  2193. if isinstance(message, Message):
  2194. await utils.answer(message, self.strings("inline_init_failed"))
  2195. return
  2196. if re.search(r"# ?scope: ?hikka_min", doc):
  2197. ver = re.search(r"# ?scope: ?hikka_min ((?:\d+\.){2}\d+)", doc).group(1)
  2198. ver_ = tuple(map(int, ver.split(".")))
  2199. if main.__version__ < ver_:
  2200. if isinstance(message, Message):
  2201. if getattr(message, "file", None):
  2202. m = utils.get_chat_id(message)
  2203. await message.edit("")
  2204. else:
  2205. m = message
  2206. await self.inline.form(
  2207. self.strings("version_incompatible").format(ver),
  2208. m,
  2209. reply_markup=[
  2210. {
  2211. "text": self.lookup("updater").strings("btn_update"),
  2212. "callback": self.lookup("updater").inline_update,
  2213. },
  2214. {
  2215. "text": self.lookup("updater").strings("cancel"),
  2216. "action": "close",
  2217. },
  2218. ],
  2219. )
  2220. return
  2221. developer = re.search(r"# ?meta developer: ?(.+)", doc)
  2222. developer = developer.group(1) if developer else False
  2223. blob_link = self.strings("blob_link") if blob_link else ""
  2224. if utils.check_url(name):
  2225. url = copy.deepcopy(name)
  2226. elif utils.check_url(origin):
  2227. url = copy.deepcopy(origin)
  2228. else:
  2229. url = None
  2230. if name is None:
  2231. try:
  2232. node = ast.parse(doc)
  2233. uid = next(
  2234. n.name
  2235. for n in node.body
  2236. if isinstance(n, ast.ClassDef)
  2237. and any(
  2238. isinstance(base, ast.Attribute)
  2239. and base.value.id == "Module"
  2240. or isinstance(base, ast.Name)
  2241. and base.id == "Module"
  2242. for base in n.bases
  2243. )
  2244. )
  2245. except Exception:
  2246. logger.debug(
  2247. "Can't parse classname from code, using legacy uid instead",
  2248. exc_info=True,
  2249. )
  2250. uid = "__extmod_" + str(uuid.uuid4())
  2251. else:
  2252. if name.startswith(self.config["MODULES_REPO"]):
  2253. name = name.split("/")[-1].split(".py")[0]
  2254. uid = name.replace("%", "%%").replace(".", "%d")
  2255. is_dragon = "@Client.on_message" in doc
  2256. if is_dragon:
  2257. module_name = f"dragon.modules.{uid}"
  2258. if not self._client.pyro_proxy:
  2259. self._client.pyro_proxy = PyroProxyClient(self._client)
  2260. await self._client.pyro_proxy.start()
  2261. await self._client.pyro_proxy.dispatcher.start()
  2262. dragon.apply_compat(self._client)
  2263. else:
  2264. module_name = f"hikka.modules.{uid}"
  2265. doc = geek.compat(doc)
  2266. async def core_overwrite(e: CoreOverwriteError):
  2267. nonlocal message
  2268. with contextlib.suppress(Exception):
  2269. self.allmodules.modules.remove(instance)
  2270. if not message:
  2271. return
  2272. await utils.answer(
  2273. message,
  2274. self.strings(f"overwrite_{e.type}").format(
  2275. *(e.target,)
  2276. if e.type == "module"
  2277. else (self.get_prefix(), e.target)
  2278. ),
  2279. )
  2280. async with (dragon.import_lock if is_dragon else lambda _: FakeLock())(
  2281. self._client
  2282. ):
  2283. with (
  2284. self._client.dragon_compat.misc.modules_help.get_notifier
  2285. if is_dragon
  2286. else FakeNotifier
  2287. )() as notifier:
  2288. try:
  2289. try:
  2290. spec = ModuleSpec(
  2291. module_name,
  2292. loader.StringLoader(doc, f"<external {module_name}>"),
  2293. origin=f"<external {module_name}>",
  2294. )
  2295. instance = await self.allmodules.register_module(
  2296. spec,
  2297. module_name,
  2298. origin,
  2299. save_fs=save_fs,
  2300. is_dragon=is_dragon,
  2301. )
  2302. if is_dragon:
  2303. dragon_module, instance = instance
  2304. instance.url = url
  2305. except ImportError as e:
  2306. logger.info(
  2307. "Module loading failed, attemping dependency installation"
  2308. " (%s)",
  2309. e.name,
  2310. )
  2311. # Let's try to reinstall dependencies
  2312. try:
  2313. requirements = list(
  2314. filter(
  2315. lambda x: not x.startswith(("-", "_", ".")),
  2316. map(
  2317. str.strip,
  2318. loader.VALID_PIP_PACKAGES.search(doc)[
  2319. 1
  2320. ].split(),
  2321. ),
  2322. )
  2323. )
  2324. except TypeError:
  2325. logger.warning(
  2326. "No valid pip packages specified in code, attemping"
  2327. " installation from error"
  2328. )
  2329. requirements = [
  2330. {
  2331. "sklearn": "scikit-learn",
  2332. "pil": "Pillow",
  2333. "telethon": "Hikka-TL",
  2334. "pyrogram": "Hikka-Pyro",
  2335. }.get(e.name.lower(), e.name)
  2336. ]
  2337. if not requirements:
  2338. raise Exception("Nothing to install") from e
  2339. logger.debug("Installing requirements: %s", requirements)
  2340. if did_requirements:
  2341. if message is not None:
  2342. await utils.answer(
  2343. message,
  2344. self.strings("requirements_restart").format(e.name),
  2345. )
  2346. return
  2347. if message is not None:
  2348. await utils.answer(
  2349. message,
  2350. self.strings("requirements_installing").format(
  2351. "\n".join(
  2352. "<emoji"
  2353. " document_id=4971987363145188045>▫️</emoji>"
  2354. f" {req}"
  2355. for req in requirements
  2356. )
  2357. ),
  2358. )
  2359. pip = await asyncio.create_subprocess_exec(
  2360. sys.executable,
  2361. "-m",
  2362. "pip",
  2363. "install",
  2364. "--upgrade",
  2365. "-q",
  2366. "--disable-pip-version-check",
  2367. "--no-warn-script-location",
  2368. *["--user"] if loader.USER_INSTALL else [],
  2369. *requirements,
  2370. )
  2371. rc = await pip.wait()
  2372. if rc != 0:
  2373. if message is not None:
  2374. if "com.termux" in os.environ.get("PREFIX", ""):
  2375. await utils.answer(
  2376. message,
  2377. self.strings("requirements_failed_termux"),
  2378. )
  2379. else:
  2380. await utils.answer(
  2381. message,
  2382. self.strings("requirements_failed"),
  2383. )
  2384. return
  2385. importlib.invalidate_caches()
  2386. kwargs = utils.get_kwargs()
  2387. kwargs["did_requirements"] = True
  2388. return await self.load_module(**kwargs) # Try again
  2389. except CoreOverwriteError as e:
  2390. await core_overwrite(e)
  2391. return
  2392. except loader.LoadError as e:
  2393. with contextlib.suppress(Exception):
  2394. await self.allmodules.unload_module(
  2395. instance.__class__.__name__
  2396. )
  2397. with contextlib.suppress(Exception):
  2398. self.allmodules.modules.remove(instance)
  2399. if message:
  2400. await utils.answer(
  2401. message,
  2402. "<emoji document_id=5454225457916420314>😖</emoji>"
  2403. f" <b>{utils.escape_html(str(e))}</b>",
  2404. )
  2405. return
  2406. except Exception as e:
  2407. logger.exception("Loading external module failed due to %s", e)
  2408. if message is not None:
  2409. await utils.answer(message, self.strings("load_failed"))
  2410. return
  2411. if hasattr(instance, "__version__") and isinstance(
  2412. instance.__version__, tuple
  2413. ):
  2414. version = (
  2415. "<b><i>"
  2416. f" (v{'.'.join(list(map(str, list(instance.__version__))))})</i></b>"
  2417. )
  2418. else:
  2419. version = ""
  2420. try:
  2421. try:
  2422. self.allmodules.send_config_one(instance)
  2423. async def inner_proxy():
  2424. nonlocal instance, message
  2425. while True:
  2426. if hasattr(instance, "hikka_wait_channel_approve"):
  2427. if message:
  2428. (
  2429. module,
  2430. channel,
  2431. reason,
  2432. ) = instance.hikka_wait_channel_approve
  2433. message = await utils.answer(
  2434. message,
  2435. self.strings("wait_channel_approve").format(
  2436. module,
  2437. channel.username,
  2438. utils.escape_html(channel.title),
  2439. utils.escape_html(reason),
  2440. self.inline.bot_username,
  2441. ),
  2442. )
  2443. return
  2444. await asyncio.sleep(0.1)
  2445. task = asyncio.ensure_future(inner_proxy())
  2446. await self.allmodules.send_ready_one(
  2447. instance,
  2448. no_self_unload=True,
  2449. from_dlmod=bool(message),
  2450. )
  2451. task.cancel()
  2452. except CoreOverwriteError as e:
  2453. await core_overwrite(e)
  2454. return
  2455. except loader.LoadError as e:
  2456. with contextlib.suppress(Exception):
  2457. await self.allmodules.unload_module(
  2458. instance.__class__.__name__
  2459. )
  2460. with contextlib.suppress(Exception):
  2461. self.allmodules.modules.remove(instance)
  2462. if message:
  2463. await utils.answer(
  2464. message,
  2465. "<emoji document_id=5454225457916420314>😖</emoji>"
  2466. f" <b>{utils.escape_html(str(e))}</b>",
  2467. )
  2468. return
  2469. except loader.SelfUnload as e:
  2470. logger.debug(
  2471. "Unloading %s, because it raised `SelfUnload`", instance
  2472. )
  2473. with contextlib.suppress(Exception):
  2474. await self.allmodules.unload_module(
  2475. instance.__class__.__name__
  2476. )
  2477. with contextlib.suppress(Exception):
  2478. self.allmodules.modules.remove(instance)
  2479. if message:
  2480. await utils.answer(
  2481. message,
  2482. "<emoji document_id=5454225457916420314>😖</emoji>"
  2483. f" <b>{utils.escape_html(str(e))}</b>",
  2484. )
  2485. return
  2486. except loader.SelfSuspend as e:
  2487. logger.debug(
  2488. "Suspending %s, because it raised `SelfSuspend`", instance
  2489. )
  2490. if message:
  2491. await utils.answer(
  2492. message,
  2493. "🥶 <b>Module suspended itself\nReason:"
  2494. f" {utils.escape_html(str(e))}</b>",
  2495. )
  2496. return
  2497. except Exception as e:
  2498. logger.exception("Module threw because of %s", e)
  2499. if message is not None:
  2500. await utils.answer(message, self.strings("load_failed"))
  2501. return
  2502. instance.hikka_meta_pic = next(
  2503. (
  2504. line.replace(" ", "").split("#metapic:", maxsplit=1)[1]
  2505. for line in doc.splitlines()
  2506. if line.replace(" ", "").startswith("#metapic:")
  2507. ),
  2508. None,
  2509. )
  2510. if is_dragon:
  2511. instance.name = (
  2512. "Dragon" + notifier.modname[0].upper() + notifier.modname[1:]
  2513. )
  2514. instance.commands = notifier.commands
  2515. self.allmodules.register_dragon(dragon_module, instance)
  2516. else:
  2517. for alias, cmd in (
  2518. self.lookup("settings").get("aliases", {}).items()
  2519. ):
  2520. if cmd in instance.commands:
  2521. self.allmodules.add_alias(alias, cmd)
  2522. try:
  2523. modname = instance.strings("name")
  2524. except (KeyError, AttributeError):
  2525. modname = getattr(instance, "name", "ERROR")
  2526. try:
  2527. developer_entity = await (
  2528. self._client.force_get_entity
  2529. if (
  2530. developer in self._client._hikka_entity_cache
  2531. and getattr(
  2532. await self._client.get_entity(developer), "left", True
  2533. )
  2534. )
  2535. else self._client.get_entity
  2536. )(developer)
  2537. except Exception:
  2538. developer_entity = None
  2539. if not isinstance(developer_entity, Channel):
  2540. developer_entity = None
  2541. if message is None:
  2542. return
  2543. modhelp = ""
  2544. if instance.__doc__:
  2545. modhelp += (
  2546. "<i>\n<emoji document_id=5787544344906959608>ℹ️</emoji>"
  2547. f" {utils.escape_html(inspect.getdoc(instance))}</i>\n"
  2548. )
  2549. subscribe = ""
  2550. subscribe_markup = None
  2551. depends_from = []
  2552. for key in dir(instance):
  2553. value = getattr(instance, key)
  2554. if isinstance(value, loader.Library):
  2555. depends_from.append(
  2556. "<emoji document_id=4971987363145188045>▫️</emoji>"
  2557. " <code>{}</code> <b>{}</b> <code>{}</code>".format(
  2558. value.__class__.__name__,
  2559. self.strings("by"),
  2560. (
  2561. value.developer
  2562. if isinstance(getattr(value, "developer", None), str)
  2563. else "Unknown"
  2564. ),
  2565. )
  2566. )
  2567. depends_from = (
  2568. self.strings("depends_from").format("\n".join(depends_from))
  2569. if depends_from
  2570. else ""
  2571. )
  2572. def loaded_msg(use_subscribe: bool = True):
  2573. nonlocal modname, version, modhelp, developer, origin, subscribe, blob_link, depends_from
  2574. return self.strings("loaded").format(
  2575. modname.strip(),
  2576. version,
  2577. utils.ascii_face(),
  2578. modhelp,
  2579. developer if not subscribe or not use_subscribe else "",
  2580. depends_from,
  2581. (
  2582. self.strings("modlink").format(origin)
  2583. if origin != "<string>" and self.config["share_link"]
  2584. else ""
  2585. ),
  2586. blob_link,
  2587. subscribe if use_subscribe else "",
  2588. )
  2589. if developer:
  2590. if developer.startswith("@") and developer not in self.get(
  2591. "do_not_subscribe", []
  2592. ):
  2593. if (
  2594. developer_entity
  2595. and getattr(developer_entity, "left", True)
  2596. and self._db.get(main.__name__, "suggest_subscribe", True)
  2597. ):
  2598. subscribe = self.strings("suggest_subscribe").format(
  2599. f"@{utils.escape_html(developer_entity.username)}"
  2600. )
  2601. subscribe_markup = [
  2602. {
  2603. "text": self.strings("subscribe"),
  2604. "callback": self._inline__subscribe,
  2605. "args": (
  2606. developer_entity.id,
  2607. functools.partial(loaded_msg, use_subscribe=False),
  2608. True,
  2609. ),
  2610. },
  2611. {
  2612. "text": self.strings("no_subscribe"),
  2613. "callback": self._inline__subscribe,
  2614. "args": (
  2615. developer,
  2616. functools.partial(loaded_msg, use_subscribe=False),
  2617. False,
  2618. ),
  2619. },
  2620. ]
  2621. developer = self.strings("developer").format(
  2622. utils.escape_html(developer)
  2623. if isinstance(developer_entity, Channel)
  2624. else f"<code>{utils.escape_html(developer)}</code>"
  2625. )
  2626. else:
  2627. developer = ""
  2628. if any(
  2629. line.replace(" ", "") == "#scope:disable_onload_docs"
  2630. for line in doc.splitlines()
  2631. ):
  2632. await utils.answer(message, loaded_msg(), reply_markup=subscribe_markup)
  2633. return
  2634. for _name, fun in sorted(
  2635. instance.commands.items(),
  2636. key=lambda x: x[0],
  2637. ):
  2638. modhelp += "\n{} <code>{}{}</code> {}".format(
  2639. (
  2640. dragon.DRAGON_EMOJI
  2641. if is_dragon
  2642. else "<emoji document_id=4971987363145188045>▫️</emoji>"
  2643. ),
  2644. self.get_prefix("dragon" if is_dragon else None),
  2645. _name,
  2646. (
  2647. utils.escape_html(fun)
  2648. if is_dragon
  2649. else (
  2650. utils.escape_html(inspect.getdoc(fun))
  2651. if fun.__doc__
  2652. else self.strings("undoc")
  2653. )
  2654. ),
  2655. )
  2656. if self.inline.init_complete and not is_dragon:
  2657. for _name, fun in sorted(
  2658. instance.inline_handlers.items(),
  2659. key=lambda x: x[0],
  2660. ):
  2661. modhelp += self.strings("ihandler").format(
  2662. f"@{self.inline.bot_username} {_name}",
  2663. (
  2664. utils.escape_html(inspect.getdoc(fun))
  2665. if fun.__doc__
  2666. else self.strings("undoc")
  2667. ),
  2668. )
  2669. try:
  2670. await utils.answer(message, loaded_msg(), reply_markup=subscribe_markup)
  2671. except telethon.errors.rpcerrorlist.MediaCaptionTooLongError:
  2672. await message.reply(loaded_msg(False))
  2673. async def _inline__subscribe(
  2674. self,
  2675. call: InlineCall,
  2676. entity: int,
  2677. msg: typing.Callable[[], str],
  2678. subscribe: bool,
  2679. ):
  2680. if not subscribe:
  2681. self.set("do_not_subscribe", self.get("do_not_subscribe", []) + [entity])
  2682. await utils.answer(call, msg())
  2683. await call.answer(self.strings("not_subscribed"))
  2684. return
  2685. await self._client(JoinChannelRequest(entity))
  2686. await utils.answer(call, msg())
  2687. await call.answer(self.strings("subscribed"))
  2688. @loader.owner
  2689. @loader.command(
  2690. ru_doc="Выгрузить модуль",
  2691. fr_doc="Décharger le module",
  2692. it_doc="Scarica il modulo",
  2693. de_doc="Entlädt ein Modul",
  2694. tr_doc="Bir modülü kaldırır",
  2695. uz_doc="Modulni o'chirish",
  2696. es_doc="Descargar el módulo",
  2697. kk_doc="Модульді жою",
  2698. )
  2699. async def unloadmod(self, message: Message):
  2700. """Unload module by class name"""
  2701. args = utils.get_args_raw(message)
  2702. if not args:
  2703. await utils.answer(message, self.strings("no_class"))
  2704. return
  2705. instance = self.lookup(args, include_dragon=True)
  2706. if issubclass(instance.__class__, loader.Library):
  2707. await utils.answer(message, self.strings("cannot_unload_lib"))
  2708. return
  2709. is_dragon = isinstance(instance, DragonModule)
  2710. if is_dragon:
  2711. worked = [instance.name] if self.allmodules.unload_dragon(instance) else []
  2712. else:
  2713. try:
  2714. worked = await self.allmodules.unload_module(args)
  2715. except CoreUnloadError as e:
  2716. await utils.answer(
  2717. message,
  2718. self.strings("unload_core").format(e.module),
  2719. )
  2720. return
  2721. if not self.allmodules.secure_boot:
  2722. self.set(
  2723. "loaded_modules",
  2724. {
  2725. mod: link
  2726. for mod, link in self.get("loaded_modules", {}).items()
  2727. if mod not in worked
  2728. },
  2729. )
  2730. msg = (
  2731. self.strings("unloaded").format(
  2732. dragon.DRAGON_EMOJI
  2733. if is_dragon
  2734. else "<emoji document_id=5784993237412351403>✅</emoji>",
  2735. ", ".join(
  2736. [(mod[:-3] if mod.endswith("Mod") else mod) for mod in worked]
  2737. ),
  2738. )
  2739. if worked
  2740. else self.strings("not_unloaded")
  2741. )
  2742. await utils.answer(message, msg)
  2743. @loader.owner
  2744. @loader.command(
  2745. ru_doc="Удалить все модули",
  2746. fr_doc="Supprimer tous les modules",
  2747. it_doc="Rimuovi tutti i moduli",
  2748. de_doc="Entfernt alle Module",
  2749. tr_doc="Tüm modülleri kaldırır",
  2750. uz_doc="Barcha modullarni o'chirish",
  2751. es_doc="Eliminar todos los módulos",
  2752. kk_doc="Барлық модульді жою",
  2753. )
  2754. async def clearmodules(self, message: Message):
  2755. """Delete all installed modules"""
  2756. await self.inline.form(
  2757. self.strings("confirm_clearmodules"),
  2758. message,
  2759. reply_markup=[
  2760. {
  2761. "text": self.strings("clearmodules"),
  2762. "callback": self._inline__clearmodules,
  2763. },
  2764. {
  2765. "text": self.strings("cancel"),
  2766. "action": "close",
  2767. },
  2768. ],
  2769. )
  2770. @loader.command(
  2771. ru_doc="Добавить дополнительный репозиторий",
  2772. fr_doc="Ajouter un dépôt supplémentaire",
  2773. it_doc="Aggiungi un repository aggiuntivo",
  2774. de_doc="Fügt ein zusätzliches Repository hinzu",
  2775. tr_doc="Ek bir depo ekler",
  2776. uz_doc="Qo'shimcha repozitoriyani qo'shish",
  2777. es_doc="Añadir un repositorio adicional",
  2778. kk_doc="Қосымша қойымдық қосу",
  2779. )
  2780. async def addrepo(self, message: Message):
  2781. """Add a repository to the list of repositories"""
  2782. args = utils.get_args_raw(message)
  2783. if not args:
  2784. await utils.answer(message, self.strings("no_repo"))
  2785. return
  2786. if args in self.config["ADDITIONAL_REPOS"]:
  2787. await utils.answer(message, self.strings("repo_exists"))
  2788. return
  2789. self.config["ADDITIONAL_REPOS"].value = self.config["ADDITIONAL_REPOS"] + [args]
  2790. await utils.answer(message, self.strings("repo_added").format(args))
  2791. @loader.command(
  2792. ru_doc="Удалить дополнительный репозиторий",
  2793. fr_doc="Supprimer un dépôt supplémentaire",
  2794. it_doc="Rimuovi un repository aggiuntivo",
  2795. de_doc="Entfernt ein zusätzliches Repository",
  2796. tr_doc="Ek bir depoyu kaldırır",
  2797. uz_doc="Qo'shimcha repozitoriyani o'chirish",
  2798. es_doc="Eliminar un repositorio adicional",
  2799. kk_doc="Қосымша қойымдықты жою",
  2800. )
  2801. async def delrepo(self, message: Message):
  2802. """Remove a repository from the list of repositories"""
  2803. args = utils.get_args_raw(message)
  2804. if not args:
  2805. await utils.answer(message, self.strings("no_repo"))
  2806. return
  2807. if args not in self.config["ADDITIONAL_REPOS"]:
  2808. await utils.answer(message, self.strings("repo_not_exists"))
  2809. return
  2810. self.config["ADDITIONAL_REPOS"].value = [
  2811. repo for repo in self.config["ADDITIONAL_REPOS"] if repo != args
  2812. ]
  2813. await utils.answer(message, self.strings("repo_deleted").format(args))
  2814. async def _inline__clearmodules(self, call: InlineCall):
  2815. self.set("loaded_modules", {})
  2816. for file in os.scandir(loader.LOADED_MODULES_DIR):
  2817. try:
  2818. shutil.rmtree(file.path)
  2819. except Exception:
  2820. logger.debug("Failed to remove %s", file.path, exc_info=True)
  2821. self.set("chosen_preset", "none")
  2822. await utils.answer(call, self.strings("all_modules_deleted"))
  2823. await self.lookup("Updater").restart_common(call)
  2824. async def _update_modules(self):
  2825. todo = await self._get_modules_to_load()
  2826. self._secure_boot = False
  2827. if self._db.get(loader.__name__, "secure_boot", False):
  2828. self._db.set(loader.__name__, "secure_boot", False)
  2829. self._secure_boot = True
  2830. else:
  2831. for mod in todo.values():
  2832. await self.download_and_install(mod)
  2833. self.update_modules_in_db()
  2834. aliases = {
  2835. alias: cmd
  2836. for alias, cmd in self.lookup("settings").get("aliases", {}).items()
  2837. if self.allmodules.add_alias(alias, cmd)
  2838. }
  2839. self.lookup("settings").set("aliases", aliases)
  2840. self.fully_loaded = True
  2841. with contextlib.suppress(AttributeError):
  2842. await self.lookup("Updater").full_restart_complete(self._secure_boot)
  2843. async def reload_core(self) -> int:
  2844. """Forcefully reload all core modules"""
  2845. self.fully_loaded = False
  2846. if self._secure_boot:
  2847. self._db.set(loader.__name__, "secure_boot", True)
  2848. for module in self.allmodules.modules:
  2849. if module.__origin__.startswith("<core"):
  2850. module.__origin__ = "<reload-core>"
  2851. loaded = await self.allmodules.register_all(no_external=True)
  2852. for instance in loaded:
  2853. self.allmodules.send_config_one(instance)
  2854. await self.allmodules.send_ready_one(
  2855. instance,
  2856. no_self_unload=False,
  2857. from_dlmod=False,
  2858. )
  2859. self.fully_loaded = True
  2860. return len(loaded)