hikka_security.py 86 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069
  1. # █ █ ▀ █▄▀ ▄▀█ █▀█ ▀
  2. # █▀█ █ █ █ █▀█ █▀▄ █
  3. # © Copyright 2022
  4. # https://t.me/hikariatama
  5. #
  6. # 🔒 Licensed under the GNU AGPLv3
  7. # 🌐 https://www.gnu.org/licenses/agpl-3.0.html
  8. import time
  9. import typing
  10. from telethon.tl.types import Message, PeerUser, User
  11. from telethon.utils import get_display_name
  12. from telethon.hints import EntityLike
  13. from .. import loader, security, utils, main
  14. from ..inline.types import InlineCall, InlineMessage
  15. from ..security import (
  16. DEFAULT_PERMISSIONS,
  17. EVERYONE,
  18. GROUP_ADMIN,
  19. GROUP_ADMIN_ADD_ADMINS,
  20. GROUP_ADMIN_BAN_USERS,
  21. GROUP_ADMIN_CHANGE_INFO,
  22. GROUP_ADMIN_DELETE_MESSAGES,
  23. GROUP_ADMIN_INVITE_USERS,
  24. GROUP_ADMIN_PIN_MESSAGES,
  25. GROUP_MEMBER,
  26. GROUP_OWNER,
  27. PM,
  28. SUDO,
  29. SUPPORT,
  30. )
  31. @loader.tds
  32. class HikkaSecurityMod(loader.Module):
  33. """Control security settings"""
  34. service_strings = {
  35. "for": "for",
  36. "forever": "forever",
  37. "user": "user",
  38. "chat": "chat",
  39. "command": "command",
  40. "module": "module",
  41. "day": "day",
  42. "days": "days",
  43. "hour": "hour",
  44. "hours": "hours",
  45. "minute": "minute",
  46. "minutes": "minutes",
  47. "second": "second",
  48. "seconds": "seconds",
  49. }
  50. service_strings_ru = {
  51. "for": "на",
  52. "forever": "навсегда",
  53. "command": "команду",
  54. "module": "модуль",
  55. "chat": "чату",
  56. "user": "пользователю",
  57. "day": "день",
  58. "days": "дня(-ей)",
  59. "hour": "час",
  60. "hours": "часа(-ов)",
  61. "minute": "минута",
  62. "minutes": "минут(-ы)",
  63. "second": "секунда",
  64. "seconds": "секунд(-ы)",
  65. }
  66. service_strings_de = {
  67. "for": "für",
  68. "forever": "für immer",
  69. "command": "Befehl",
  70. "module": "Modul",
  71. "chat": "Chat",
  72. "user": "Benutzer",
  73. "day": "Tag",
  74. "days": "Tage",
  75. "hour": "Stunde",
  76. "hours": "Stunden",
  77. "minute": "Minute",
  78. "minutes": "Minuten",
  79. "second": "Sekunde",
  80. "seconds": "Sekunden",
  81. }
  82. service_strings_uz = {
  83. "for": "uchun",
  84. "forever": "doimiy",
  85. "command": "buyruq",
  86. "module": "modul",
  87. "chat": "guruh",
  88. "user": "foydalanuvchi",
  89. "day": "kun",
  90. "days": "kun",
  91. "hour": "soat",
  92. "hours": "soat",
  93. "minute": "daqiqa",
  94. "minutes": "daqiqa",
  95. "second": "soniya",
  96. "seconds": "soniya",
  97. }
  98. service_strings_tr = {
  99. "for": "için",
  100. "forever": "sürekli",
  101. "command": "komut",
  102. "module": "modül",
  103. "chat": "sohbet",
  104. "user": "kullanıcı",
  105. "day": "gün",
  106. "days": "gün",
  107. "hour": "saat",
  108. "hours": "saat",
  109. "minute": "dakika",
  110. "minutes": "dakika",
  111. "second": "saniye",
  112. "seconds": "saniye",
  113. }
  114. service_strings_hi = {
  115. "for": "के लिए",
  116. "forever": "हमेशा",
  117. "command": "कमांड",
  118. "module": "मॉड्यूल",
  119. "chat": "चैट",
  120. "user": "उपयोगकर्ता",
  121. "day": "दिन",
  122. "days": "दिन",
  123. "hour": "घंटा",
  124. "hours": "घंटे",
  125. "minute": "मिनट",
  126. "minutes": "मिनट",
  127. "second": "सेकंड",
  128. "seconds": "सेकंड",
  129. }
  130. service_strings_ja = {
  131. "for": "のために",
  132. "forever": "永遠に",
  133. "command": "コマンド",
  134. "module": "モジュール",
  135. "chat": "チャット",
  136. "user": "ユーザー",
  137. "day": "日",
  138. "days": "日",
  139. "hour": "時間",
  140. "hours": "時間",
  141. "minute": "分",
  142. "minutes": "分",
  143. "second": "秒",
  144. "seconds": "秒",
  145. }
  146. service_strings_kr = {
  147. "for": "에 대한",
  148. "forever": "영원히",
  149. "command": "명령",
  150. "module": "모듈",
  151. "chat": "채팅",
  152. "user": "사용자",
  153. "day": "일",
  154. "days": "일",
  155. "hour": "시간",
  156. "hours": "시간",
  157. "minute": "분",
  158. "minutes": "분",
  159. "second": "초",
  160. "seconds": "초",
  161. }
  162. service_strings_ar = {
  163. "for": "ل",
  164. "forever": "للأبد",
  165. "command": "أمر",
  166. "module": "وحدة",
  167. "chat": "دردشة",
  168. "user": "مستخدم",
  169. "day": "يوم",
  170. "days": "أيام",
  171. "hour": "ساعة",
  172. "hours": "ساعات",
  173. "minute": "دقيقة",
  174. "minutes": "دقائق",
  175. "second": "ثانية",
  176. "seconds": "ثواني",
  177. }
  178. service_strings_es = {
  179. "for": "para",
  180. "forever": "para siempre",
  181. "command": "comando",
  182. "module": "módulo",
  183. "chat": "chat",
  184. "user": "usuario",
  185. "day": "día",
  186. "days": "días",
  187. "hour": "hora",
  188. "hours": "horas",
  189. "minute": "minuto",
  190. "minutes": "minutos",
  191. "second": "segundo",
  192. "seconds": "segundos",
  193. }
  194. strings = {
  195. "name": "HikkaSecurity",
  196. "no_command": "🚫 <b>Command </b><code>{}</code><b> not found!</b>",
  197. "permissions": (
  198. "🔐 <b>Here you can configure permissions for </b><code>{}{}</code>"
  199. ),
  200. "close_menu": "🙈 Close this menu",
  201. "global": (
  202. "🔐 <b>Here you can configure global bounding mask. If the permission is"
  203. " excluded here, it is excluded everywhere!</b>"
  204. ),
  205. "owner": "😎 Owner",
  206. "sudo": "🧐 Sudo",
  207. "support": "🤓 Support",
  208. "group_owner": "🧛‍♂️ Group owner",
  209. "group_admin_add_admins": "🧑‍⚖️ Admin (add members)",
  210. "group_admin_change_info": "🧑‍⚖️ Admin (change info)",
  211. "group_admin_ban_users": "🧑‍⚖️ Admin (ban)",
  212. "group_admin_delete_messages": "🧑‍⚖️ Admin (delete msgs)",
  213. "group_admin_pin_messages": "🧑‍⚖️ Admin (pin)",
  214. "group_admin_invite_users": "🧑‍⚖️ Admin (invite)",
  215. "group_admin": "🧑‍⚖️ Admin (any)",
  216. "group_member": "👥 In group",
  217. "pm": "🤙 In PM",
  218. "everyone": "🌍 Everyone (Inline)",
  219. "owner_list": (
  220. "<emoji document_id=5386399931378440814>😎</emoji> <b>Users in group"
  221. " </b><code>owner</code><b>:</b>\n\n{}"
  222. ),
  223. "sudo_list": (
  224. "<emoji document_id=5418133868475587618>🧐</emoji> <b>Users in group"
  225. " </b><code>sudo</code><b>:</b>\n\n{}"
  226. ),
  227. "support_list": (
  228. "<emoji document_id=5415729507128580146>🤓</emoji> <b>Users in group"
  229. " </b><code>support</code><b>:</b>\n\n{}"
  230. ),
  231. "no_owner": (
  232. "<emoji document_id=5386399931378440814>😎</emoji> <b>There is no users in"
  233. " group </b><code>owner</code>"
  234. ),
  235. "no_sudo": (
  236. "<emoji document_id=5418133868475587618>🧐</emoji> <b>There is no users in"
  237. " group </b><code>sudo</code>"
  238. ),
  239. "no_support": (
  240. "<emoji document_id=5415729507128580146>🤓</emoji> <b>There is no users in"
  241. " group </b><code>support</code>"
  242. ),
  243. "owner_added": (
  244. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  245. ' href="tg://user?id={}">{}</a> added to group </b><code>owner</code>'
  246. ),
  247. "sudo_added": (
  248. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  249. ' href="tg://user?id={}">{}</a> added to group </b><code>sudo</code>'
  250. ),
  251. "support_added": (
  252. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  253. ' href="tg://user?id={}">{}</a> added to group </b><code>support</code>'
  254. ),
  255. "owner_removed": (
  256. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  257. ' href="tg://user?id={}">{}</a> removed from group </b><code>owner</code>'
  258. ),
  259. "sudo_removed": (
  260. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  261. ' href="tg://user?id={}">{}</a> removed from group </b><code>sudo</code>'
  262. ),
  263. "support_removed": (
  264. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  265. ' href="tg://user?id={}">{}</a> removed from group </b><code>support</code>'
  266. ),
  267. "no_user": (
  268. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Specify user to"
  269. " permit</b>"
  270. ),
  271. "not_a_user": (
  272. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Specified entity is"
  273. " not a user</b>"
  274. ),
  275. "li": '⦿ <b><a href="tg://user?id={}">{}</a></b>',
  276. "warning": (
  277. "⚠️ <b>Please, confirm, that you want to add <a"
  278. ' href="tg://user?id={}">{}</a> to group </b><code>{}</code><b>!\nThis'
  279. " action may reveal personal info and grant full or partial access to"
  280. " userbot to this user</b>"
  281. ),
  282. "cancel": "🚫 Cancel",
  283. "confirm": "👑 Confirm",
  284. "enable_nonick_btn": "🔰 Enable",
  285. "self": (
  286. "<emoji document_id=5415905755406539934>🚫</emoji> <b>You can't"
  287. " promote/demote yourself!</b>"
  288. ),
  289. "suggest_nonick": "🔰 <i>Do you want to enable NoNick for this user?</i>",
  290. "user_nn": '🔰 <b>NoNick for <a href="tg://user?id={}">{}</a> enabled</b>',
  291. "what": (
  292. "<emoji document_id=6053166094816905153>🚫</emoji> <b>You need to specify"
  293. " the type of target as first argument (</b><code>user</code><b> or"
  294. " </b><code>chat</code><b>)</b>"
  295. ),
  296. "no_target": (
  297. "<emoji document_id=6053166094816905153>🚫</emoji> <b>You didn't specify"
  298. " the target of security rule</b>"
  299. ),
  300. "no_rule": (
  301. "<emoji document_id=6053166094816905153>🚫</emoji> <b>You didn't specify"
  302. " the rule (module or command)</b>"
  303. ),
  304. "confirm_rule": (
  305. "🔐 <b>Please, confirm that you want to give {} <a href='{}'>{}</a> a"
  306. " permission to use {} </b><code>{}</code><b> {}?</b>"
  307. ),
  308. "rule_added": (
  309. "🔐 <b>You gave {} <a href='{}'>{}</a> a"
  310. " permission to use {} </b><code>{}</code><b> {}</b>"
  311. ),
  312. "confirm_btn": "👑 Confirm",
  313. "cancel_btn": "🚫 Cancel",
  314. "multiple_rules": (
  315. "🔐 <b>Unable to unambiguously determine the security rule. Please, choose"
  316. " the one you meant:</b>\n\n{}"
  317. ),
  318. "rules": (
  319. "<emoji document_id=5472308992514464048>🔐</emoji> <b>Targeted security"
  320. " rules:</b>\n\n{}"
  321. ),
  322. "no_rules": (
  323. "<emoji document_id=6053166094816905153>🚫</emoji> <b>No targeted security"
  324. " rules</b>"
  325. ),
  326. "owner_target": (
  327. "<emoji document_id=6053166094816905153>🚫</emoji> <b>This user is owner"
  328. " and can't be promoted by targeted security</b>"
  329. ),
  330. "rules_removed": (
  331. "<emoji document_id=5472308992514464048>🔐</emoji> <b>Targeted security"
  332. ' rules for <a href="{}">{}</a> removed</b>'
  333. ),
  334. **service_strings,
  335. }
  336. strings_ru = {
  337. "no_command": (
  338. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Команда"
  339. " </b><code>{}</code><b> не найдена!</b>"
  340. ),
  341. "permissions": (
  342. "🔐 <b>Здесь можно настроить разрешения для команды </b><code>{}{}</code>"
  343. ),
  344. "close_menu": "🙈 Закрыть это меню",
  345. "global": (
  346. "🔐 <b>Здесь можно настроить глобальную исключающую маску. Если тумблер"
  347. " выключен здесь, он выключен для всех команд</b>"
  348. ),
  349. "owner": "😎 Владелец",
  350. "sudo": "🧐 Sudo",
  351. "support": "🤓 Помощник",
  352. "group_owner": "🧛‍♂️ Влад. группы",
  353. "group_admin_add_admins": "🧑‍⚖️ Админ (добавлять участников)",
  354. "group_admin_change_info": "🧑‍⚖️ Админ (изменять инфо)",
  355. "group_admin_ban_users": "🧑‍⚖️ Админ (банить)",
  356. "group_admin_delete_messages": "🧑‍⚖️ Админ (удалять сообщения)",
  357. "group_admin_pin_messages": "🧑‍⚖️ Админ (закреплять)",
  358. "group_admin_invite_users": "🧑‍⚖️ Админ (приглашать)",
  359. "group_admin": "🧑‍⚖️ Админ (любой)",
  360. "group_member": "👥 В группе",
  361. "pm": "🤙 В лс",
  362. "owner_list": (
  363. "<emoji document_id=5386399931378440814>😎</emoji> <b>Пользователи группы"
  364. " </b><code>owner</code><b>:</b>\n\n{}"
  365. ),
  366. "sudo_list": (
  367. "<emoji document_id=5418133868475587618>🧐</emoji> <b>Пользователи группы"
  368. " </b><code>sudo</code><b>:</b>\n\n{}"
  369. ),
  370. "support_list": (
  371. "<emoji document_id=5415729507128580146>🤓</emoji> <b>Пользователи группы"
  372. " </b><code>support</code><b>:</b>\n\n{}"
  373. ),
  374. "no_owner": (
  375. "<emoji document_id=5386399931378440814>😎</emoji> <b>Нет пользователей в"
  376. " группе </b><code>owner</code>"
  377. ),
  378. "no_sudo": (
  379. "<emoji document_id=5418133868475587618>🧐</emoji> <b>Нет пользователей в"
  380. " группе </b><code>sudo</code>"
  381. ),
  382. "no_support": (
  383. "<emoji document_id=5415729507128580146>🤓</emoji> <b>Нет пользователей в"
  384. " группе </b><code>support</code>"
  385. ),
  386. "no_user": (
  387. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Укажи, кому выдавать"
  388. " права</b>"
  389. ),
  390. "not_a_user": (
  391. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Указанная цель - не"
  392. " пользователь</b>"
  393. ),
  394. "cancel": "🚫 Отмена",
  395. "confirm": "👑 Подтвердить",
  396. "self": (
  397. "<emoji document_id=5415905755406539934>🚫</emoji> <b>Нельзя управлять"
  398. " своими правами!</b>"
  399. ),
  400. "warning": (
  401. '⚠️ <b>Ты действительно хочешь добавить <a href="tg://user?id={}">{}</a> в'
  402. " группу </b><code>{}</code><b>!\nЭто действие может передать частичный или"
  403. " полный доступ к юзерботу этому пользователю!</b>"
  404. ),
  405. "suggest_nonick": (
  406. "🔰 <i>Хочешь ли ты включить NoNick для этого пользователя?</i>"
  407. ),
  408. "user_nn": '🔰 <b>NoNick для <a href="tg://user?id={}">{}</a> включен</b>',
  409. "enable_nonick_btn": "🔰 Включить",
  410. "owner_added": (
  411. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  412. ' href="tg://user?id={}">{}</a> добавлен в группу </b><code>owner</code>'
  413. ),
  414. "sudo_added": (
  415. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  416. ' href="tg://user?id={}">{}</a> добавлен в группу </b><code>sudo</code>'
  417. ),
  418. "support_added": (
  419. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  420. ' href="tg://user?id={}">{}</a> добавлен в группу </b><code>support</code>'
  421. ),
  422. "owner_removed": (
  423. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  424. ' href="tg://user?id={}">{}</a> удален из группы </b><code>owner</code>'
  425. ),
  426. "sudo_removed": (
  427. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  428. ' href="tg://user?id={}">{}</a> удален из группы </b><code>sudo</code>'
  429. ),
  430. "support_removed": (
  431. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  432. ' href="tg://user?id={}">{}</a> удален из группы </b><code>support</code>'
  433. ),
  434. "_cls_doc": "Управление настройками безопасности",
  435. "what": (
  436. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Вам нужно указать"
  437. " тип цели первым аргументов (</b><code>user</code><b> or"
  438. " </b><code>chat</code><b>)</b>"
  439. ),
  440. "no_target": (
  441. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Не указана цель"
  442. " правила безопасности</b>"
  443. ),
  444. "no_rule": (
  445. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Не указано правило"
  446. " безопасности (модуль или команда)</b>"
  447. ),
  448. "confirm_rule": (
  449. "🔐 <b>Пожалуйста, подтвердите что хотите выдать {} <a href='{}'>{}</a>"
  450. " право использовать {} </b><code>{}</code><b> {}</b>"
  451. ),
  452. "multiple_rules": (
  453. "🔐 <b>Не получилось однозначно распознать правила безопасности. Выберите"
  454. " то, которое имели ввиду:</b>\n\n{}"
  455. ),
  456. "rule_added": (
  457. "🔐 <b>Вы выдали {} <a href='{}'>{}</a> право"
  458. " использовать {} </b><code>{}</code><b> {}</b>"
  459. ),
  460. "rules": (
  461. "<emoji document_id=5472308992514464048>🔐</emoji> <b>Таргетированные"
  462. " правила безопасности:</b>\n\n{}"
  463. ),
  464. "no_rules": (
  465. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Нет таргетированных"
  466. " правил безопасности</b>"
  467. ),
  468. "owner_target": (
  469. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Этот пользователь -"
  470. " владелец, его права не могут управляться таргетированной"
  471. " безопасностью</b>"
  472. ),
  473. "rules_removed": (
  474. "<emoji document_id=5472308992514464048>🔐</emoji> <b>Правила"
  475. ' таргетированной безопасности для <a href="{}">{}</a> удалены</b>'
  476. ),
  477. **service_strings_ru,
  478. }
  479. strings_de = {
  480. "owner_added": (
  481. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  482. ' href="tg://user?id={}">{}</a> wurde der Gruppe </b><code>owner</code>'
  483. "<b> hinzugefügt</b>"
  484. ),
  485. "sudo_added": (
  486. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  487. ' href="tg://user?id={}">{}</a> wurde der Gruppe </b><code>sudo</code>'
  488. "<b> hinzugefügt</b>"
  489. ),
  490. "support_added": (
  491. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  492. ' href="tg://user?id={}">{}</a> wurde der Gruppe </b><code>support</code>'
  493. "<b> hinzugefügt</b>"
  494. ),
  495. "owner_removed": (
  496. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  497. ' href="tg://user?id={}">{}</a> wurde aus der Gruppe </b><code>owner</code>'
  498. "<b> entfernt</b>"
  499. ),
  500. "sudo_removed": (
  501. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  502. ' href="tg://user?id={}">{}</a> wurde aus der Gruppe </b><code>sudo</code>'
  503. "<b> entfernt</b>"
  504. ),
  505. "support_removed": (
  506. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  507. ' href="tg://user?id={}">{}</a> wurde aus der Gruppe'
  508. " </b><code>support</code><b> entfernt</b>"
  509. ),
  510. "_cls_doc": "Verwalten Sie die Sicherheitseinstellungen",
  511. "what": (
  512. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Erstes Argument"
  513. " (</b><code>user</code><b> or </b><code>chat</code><b>)"
  514. " fehlt</b>"
  515. ),
  516. "no_user": (
  517. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Benutzer nicht"
  518. " gefunden</b>"
  519. ),
  520. "no_chat": (
  521. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Chat nicht"
  522. " gefunden</b>"
  523. ),
  524. "what_rule": (
  525. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Keine Regel"
  526. " angegeben (Modul oder Kommando)</b>"
  527. ),
  528. "no_rule": (
  529. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Keine Regel"
  530. " angegeben (Modul oder Kommando)</b>"
  531. ),
  532. "confirm_rule": (
  533. "🔐 <b>Bitte bestätigen Sie, dass Sie {} <a href='{}'>{}</a>"
  534. " die Berechtigung erteilen möchten </b><code>{}</code><b> {}</b>"
  535. ),
  536. "multiple_rules": (
  537. "🔐 <b>Es war nicht möglich, die Sicherheitsregeln eindeutig zu erkennen."
  538. " Wählen Sie das aus, was Sie wollten:</b>\n\n{}"
  539. ),
  540. "rule_added": (
  541. "🔐 <b>Sie haben {} <a href='{}'>{}</a> die Berechtigung"
  542. " erteilt </b><code>{}</code><b> {}</b>"
  543. ),
  544. "rules": (
  545. "<emoji document_id=5472308992514464048>🔐</emoji> <b>Regeln für die"
  546. " Sicherheit:</b>\n\n{}"
  547. ),
  548. "no_rules": (
  549. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Keine Regeln für die"
  550. " Sicherheit</b>"
  551. ),
  552. "owner_target": (
  553. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Dieser Benutzer ist"
  554. " der Besitzer, seine Rechte können nicht mit Sicherheitszielen"
  555. " verwaltet werden</b>"
  556. ),
  557. "rules_removed": (
  558. "<emoji document_id=5472308992514464048>🔐</emoji> <b>Die Sicherheitsregeln"
  559. " für <a href='{}'>{}</a> wurden entfernt</b>"
  560. ),
  561. **service_strings_de,
  562. }
  563. strings_hi = {
  564. "owner_added": (
  565. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  566. ' href="tg://user?id={}">{}</a> ग्रुप में </b><code>owner</code>'
  567. "<b> जोड़ा गया</b>"
  568. ),
  569. "sudo_added": (
  570. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  571. ' href="tg://user?id={}">{}</a> ग्रुप में </b><code>sudo</code>'
  572. "<b> जोड़ा गया</b>"
  573. ),
  574. "support_added": (
  575. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  576. ' href="tg://user?id={}">{}</a> ग्रुप में </b><code>support</code>'
  577. "<b> जोड़ा गया</b>"
  578. ),
  579. "owner_removed": (
  580. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  581. ' href="tg://user?id={}">{}</a> ग्रुप से </b><code>owner</code>'
  582. "<b> हटा दिया गया</b>"
  583. ),
  584. "sudo_removed": (
  585. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  586. ' href="tg://user?id={}">{}</a> ग्रुप से </b><code>sudo</code>'
  587. "<b> हटा दिया गया</b>"
  588. ),
  589. "support_removed": (
  590. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  591. ' href="tg://user?id={}">{}</a> ग्रुप से </b><code>support</code>'
  592. "<b> हटा दिया गया</b>"
  593. ),
  594. "_cls_doc": "सुरक्षा सेटिंग्स का प्रबंधन करें",
  595. "what": (
  596. "<emoji document_id=6053166094816905153>🚫</emoji> <b>पहला तर्क"
  597. " (</b><code>user</code><b> or </b><code>chat</code><b>) नहीं मिला</b>"
  598. ),
  599. "no_user": (
  600. "<emoji document_id=6053166094816905153>🚫</emoji> <b>उपयोगकर्ता नहीं"
  601. " मिला</b>"
  602. ),
  603. "no_chat": (
  604. "<emoji document_id=6053166094816905153>🚫</emoji> <b>चैट नहीं मिला</b>"
  605. ),
  606. "what_rule": (
  607. "<emoji document_id=6053166094816905153>🚫</emoji> <b>कोई नियम नहीं दिया गया"
  608. " (मॉड्यूल या कमांड)</b>"
  609. ),
  610. "no_rule": (
  611. "<emoji document_id=6053166094816905153>🚫</emoji> <b>कोई नियम नहीं दिया गया"
  612. " (मॉड्यूल या कमांड)</b>"
  613. ),
  614. "confirm_rule": (
  615. "🔐 <b>कृपया पुष्टि करें कि आप {} <a href='{}'>{}</a> को अनुमति देना चाहते"
  616. " हैं </b><code>{}</code><b> {}</b>"
  617. ),
  618. "multiple_rules": "🔐 <b>सुरक्षा नियमों को अभिन्नता से प्रबंधित करें</b>\n\n{}",
  619. "no_rules": (
  620. "<emoji document_id=6053166094816905153>🚫</emoji> <b>कोई सुरक्षा नियम"
  621. " नहीं</b>"
  622. ),
  623. "owner_target": (
  624. "<emoji document_id=6053166094816905153>🚫</emoji> <b>यह उपयोगकर्ता मालिक"
  625. " है, उसके अधिकार सुरक्षा लक्ष्यों के साथ प्रबंधित नहीं किए जा सकते</b>"
  626. ),
  627. "rules_removed": (
  628. "<emoji document_id=5472308992514464048>🔐</emoji> <b>सुरक्षा नियम"
  629. " के लिए <a href='{}'>{}</a> को हटा दिया गया है</b>"
  630. ),
  631. **service_strings_hi,
  632. }
  633. strings_tr = {
  634. "owner_added": (
  635. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  636. ' href="tg://user?id={}">{}</a> adlı kullanıcı </b><code>sahip</code>'
  637. "<b> grubuna eklendi</b>"
  638. ),
  639. "sudo_added": (
  640. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  641. ' href="tg://user?id={}">{}</a> adlı kullanıcı </b><code>yönetici</code>'
  642. "<b> grubuna eklendi</b>"
  643. ),
  644. "support_added": (
  645. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  646. ' href="tg://user?id={}">{}</a> adlı kullanıcı </b><code>destek</code>'
  647. "<b> grubuna eklendi</b>"
  648. ),
  649. "owner_removed": (
  650. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  651. ' href="tg://user?id={}">{}</a> adlı kullanıcı </b><code>sahip</code>'
  652. "<b> grubundan çıkartıldı</b>"
  653. ),
  654. "sudo_removed": (
  655. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  656. ' href="tg://user?id={}">{}</a> adlı kullanıcı </b><code>yönetici</code>'
  657. "<b> grubundan çıkartıldı</b>"
  658. ),
  659. "support_removed": (
  660. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  661. ' href="tg://user?id={}">{}</a> adlı kullanıcı </b><code>destek</code>'
  662. "<b> grubundan çıkartıldı</b>"
  663. ),
  664. "_cls_doc": "Güvenlik ayarlarını yönet",
  665. "what": (
  666. "<emoji document_id=6053166094816905153>🚫</emoji> <b>İlk argüman"
  667. " (</b><code>user</code><b> veya </b><code>chat</code><b>) bulunamadı</b>"
  668. ),
  669. "no_user": (
  670. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Kullanıcı"
  671. " bulunamadı</b>"
  672. ),
  673. "no_chat": (
  674. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Sohbet bulunamadı</b>"
  675. ),
  676. "what_rule": (
  677. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Hiçbir kural"
  678. " belirtilmedi (modül veya komut)</b>"
  679. ),
  680. "no_rule": (
  681. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Hiçbir kural"
  682. " belirtilmedi (modül veya komut)</b>"
  683. ),
  684. "confirm_rule": (
  685. "🔐 <b>Lütfen {} <a href='{}'>{}</a> için izin vermek istediğinize emin olun"
  686. " </b><code>{}</code><b> {}</b>"
  687. ),
  688. "multiple_rules": "🔐 <b>Güvenlik kurallarını yönetin</b>\n\n{}",
  689. "no_rules": (
  690. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Hiçbir güvenlik kuralı"
  691. " yok</b>"
  692. ),
  693. "owner_target": (
  694. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Bu kullanıcı sahiptir,"
  695. " izinleri güvenlik hedefleriyle yönetilemez</b>"
  696. ),
  697. "rules_removed": (
  698. "<emoji document_id=5472308992514464048>🔐</emoji> <b><a href='{}'>{}</a>"
  699. " için güvenlik kuralları kaldırıldı</b>"
  700. ),
  701. **service_strings_tr,
  702. }
  703. strings_uz = {
  704. "global": (
  705. "🔐 <b>Bu erda siz global chegaralash maskasini ta'hrirlashingiz mumkin."
  706. " Agar bu erda ruxsat berilmasa, qolgan joylarda ham ruxsat berilmaydi!</b>"
  707. ),
  708. "warning": (
  709. '⚠️ <b>Iltimos, ta\'sdiqlang, siz <a href="tg://user?id={}">{}</a>'
  710. " </b><code>{}</code><b> ega gruppasiga qushmoqchimisiz? Bu harakat shaxsiy"
  711. " ma'lumotni oshkor va foydalanuvchiga userbot ishlatishiga toʻliq yoki"
  712. " qisman ruxsat berishi mumkin</b>"
  713. ),
  714. "owner_added": (
  715. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  716. ' href="tg://user?id={}">{}</a> </b><code>owner</code>'
  717. "<b> qo'shildi</b>"
  718. ),
  719. "sudo_added": (
  720. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  721. ' href="tg://user?id={}">{}</a> </b><code>sudo</code>'
  722. "<b> qo'shildi</b>"
  723. ),
  724. "support_added": (
  725. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  726. ' href="tg://user?id={}">{}</a> </b><code>support</code>'
  727. "<b> qo'shildi</b>"
  728. ),
  729. "owner_removed": (
  730. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  731. ' href="tg://user?id={}">{}</a> </b><code>owner</code>'
  732. "<b> o'chirildi</b>"
  733. ),
  734. "sudo_removed": (
  735. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  736. ' href="tg://user?id={}">{}</a> </b><code>sudo</code>'
  737. "<b> o'chirildi</b>"
  738. ),
  739. "support_removed": (
  740. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  741. ' href="tg://user?id={}">{}</a> </b><code>support</code>'
  742. "<b> o'chirildi</b>"
  743. ),
  744. "_cls_doc": "Xavfsizlik sozlamalarini boshqarish",
  745. "what": (
  746. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Ilk argument"
  747. " (</b><code>user</code><b> yoki </b><code>chat</code><b>) topilmadi</b>"
  748. ),
  749. "no_user": (
  750. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Foydalanuvchi"
  751. " topilmadi</b>"
  752. ),
  753. "no_chat": (
  754. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Guruh topilmadi</b>"
  755. ),
  756. "what_rule": (
  757. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Hech qanday qoida"
  758. " belgilanmadi (modul yoki buyruq)</b>"
  759. ),
  760. "no_rule": (
  761. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Hech qanday qoida"
  762. " belgilanmadi (modul yoki buyruq)</b>"
  763. ),
  764. "confirm_rule": (
  765. "🔐 <b>Iltimos {} <a href='{}'>{}</a> uchun ruxsat berishni"
  766. " istaysizmi</b><code>{}</code><b> {}</b>"
  767. ),
  768. "multiple_rules": "🔐 <b>Xavfsizlik qoidalarni boshqarish</b>\n\n{}",
  769. "no_rules": (
  770. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Hech qanday xavfsizlik"
  771. " qoidasi yo'q</b>"
  772. ),
  773. "owner_target": (
  774. "<emoji document_id=6053166094816905153>🚫</emoji> <b>Ushbu foydalanuvchi"
  775. " egasi, ruxsatlar xavfsizlik maqsadlari bilan boshqarilishi mumkin"
  776. " emas</b>"
  777. ),
  778. "rules_removed": (
  779. "<emoji document_id=5472308992514464048>🔐</emoji> <b><a href='{}'>{}</a>"
  780. " uchun xavfsizlik qoidalari o'chirildi</b>"
  781. ),
  782. **service_strings_uz,
  783. }
  784. strings_ja = {
  785. "global": (
  786. "🔐 <b>このグループでは、グローバルなセキュリティ設定を変更できます。このグループで許可されない場合、他のグループでも許可されません!</b>"
  787. ),
  788. "warning": (
  789. '⚠️ <b>本当に、<a href="tg://user?id={}">{}</a> '
  790. " </b><code>{}</code><b>グループに追加しますか? この操作は、個人情報を"
  791. "漏洩させ、ユーザーボットを完全または部分的に許可する可能性があります</b>"
  792. ),
  793. "owner_added": (
  794. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  795. ' href="tg://user?id={}">{}</a> </b><code>owner</code>'
  796. "<b> 追加されました</b>"
  797. ),
  798. "sudo_added": (
  799. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  800. ' href="tg://user?id={}">{}</a> </b><code>sudo</code>'
  801. "<b> 追加されました</b>"
  802. ),
  803. "support_added": (
  804. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  805. ' href="tg://user?id={}">{}</a> </b><code>support</code>'
  806. "<b> 追加されました</b>"
  807. ),
  808. "owner_removed": (
  809. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  810. ' href="tg://user?id={}">{}</a> </b><code>owner</code>'
  811. "<b> 削除されました</b>"
  812. ),
  813. "sudo_removed": (
  814. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  815. ' href="tg://user?id={}">{}</a> </b><code>sudo</code>'
  816. "<b> 削除されました</b>"
  817. ),
  818. "support_removed": (
  819. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  820. ' href="tg://user?id={}">{}</a> </b><code>support</code>'
  821. "<b> 削除されました</b>"
  822. ),
  823. "_cls_doc": "セキュリティ設定を管理する",
  824. "what": (
  825. "<emoji document_id=6053166094816905153>🚫</emoji> <b>最初の引数"
  826. " (</b><code>user</code><b> または </b><code>chat</code><b>) が見つかりません</b>"
  827. ),
  828. "no_user": (
  829. "<emoji document_id=6053166094816905153>🚫</emoji> <b>ユーザーが見つかりません</b>"
  830. ),
  831. "no_chat": (
  832. "<emoji document_id=6053166094816905153>🚫</emoji> <b>グループが見つかりません</b>"
  833. ),
  834. "what_rule": (
  835. "<emoji document_id=6053166094816905153>🚫</emoji> <b>どのルールも指定されていません"
  836. " (モジュールまたはコマンド)</b>"
  837. ),
  838. "no_rule": (
  839. "<emoji document_id=6053166094816905153>🚫</emoji> <b>どのルールも指定されていません"
  840. " (モジュールまたはコマンド)</b>"
  841. ),
  842. "confirm_rule": (
  843. "🔐 <b>本当に {} <a href='{}'>{}</a> </b><code>{}</code><b> {}</b>"
  844. ),
  845. "multiple_rules": "🔐 <b>セキュリティルールを管理する</b>\n\n{}",
  846. "no_rules": (
  847. "<emoji document_id=6053166094816905153>🚫</emoji> <b>セキュリティルールがありません</b>"
  848. ),
  849. "owner_target": (
  850. "<emoji document_id=6053166094816905153>🚫</emoji> <b>このユーザーは"
  851. "所有者であり、セキュリティ目的で管理できません</b>"
  852. ),
  853. "rules_removed": (
  854. "<emoji document_id=5472308992514464048>🔐</emoji> <b>安全規則"
  855. " for <a href='{}'>{}</a> は削除されました</b>"
  856. ),
  857. **service_strings_ja,
  858. }
  859. strings_kr = {
  860. "global": (
  861. "🔐 <b>이 그룹에서는 전역 보안 설정을 변경할 수 있습니다."
  862. "이 그룹에서 허용되지 않은 경우 다른 그룹에서도 허용되지 않습니다!</b>"
  863. ),
  864. "warning": (
  865. '⚠️ <b>정말로 <a href="tg://user?id={}">{}</a> '
  866. " </b><code>{}</code><b> 그룹에 추가 하시겠습니까? 이 작업은 개인 정보를"
  867. "유출시키고 사용자 봇을 완전히 또는 부분적으로 허용할 수 있습니다</b>"
  868. ),
  869. "owner_added": (
  870. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  871. ' href="tg://user?id={}">{}</a> </b><code>owner</code>'
  872. "<b> 추가되었습니다</b>"
  873. ),
  874. "sudo_added": (
  875. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  876. ' href="tg://user?id={}">{}</a> </b><code>sudo</code>'
  877. "<b> 추가되었습니다</b>"
  878. ),
  879. "support_added": (
  880. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  881. ' href="tg://user?id={}">{}</a> </b><code>support</code>'
  882. "<b> 추가되었습니다</b>"
  883. ),
  884. "owner_removed": (
  885. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  886. ' href="tg://user?id={}">{}</a> </b><code>owner</code>'
  887. "<b> 제거되었습니다</b>"
  888. ),
  889. "sudo_removed": (
  890. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  891. ' href="tg://user?id={}">{}</a> </b><code>sudo</code>'
  892. "<b> 제거되었습니다</b>"
  893. ),
  894. "support_removed": (
  895. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  896. ' href="tg://user?id={}">{}</a> </b><code>support</code>'
  897. "<b> 제거되었습니다</b>"
  898. ),
  899. "_cls_doc": "보안 설정을 관리합니다",
  900. "what": (
  901. "<emoji document_id=6053166094816905153>🚫</emoji> <b>첫 번째 인수"
  902. " (</b><code>user</code><b> 또는 </b><code>chat</code><b>)를 찾을 수 없습니다</b>"
  903. ),
  904. "no_user": (
  905. "<emoji document_id=6053166094816905153>🚫</emoji> <b>사용자를 찾을 수 없습니다</b>"
  906. ),
  907. "no_chat": (
  908. "<emoji document_id=6053166094816905153>🚫</emoji> <b>그룹을 찾을 수 없습니다</b>"
  909. ),
  910. "what_rule": (
  911. "<emoji document_id=6053166094816905153>🚫</emoji> <b>어떤 규칙도 지정되지 않았습니다 (모듈"
  912. " 또는 명령)</b>"
  913. ),
  914. "no_rule": (
  915. "<emoji document_id=6053166094816905153>🚫</emoji> <b>어떤 규칙도 지정되지 않았습니다 (모듈"
  916. " 또는 명령)</b>"
  917. ),
  918. "confirm_rule": (
  919. "🔐 <b>정말로 {} <a href='{}'>{}</a> </b><code>{}</code><b> {}</b>"
  920. ),
  921. "multiple_rules": "🔐 <b>보안 규칙을 관리합니다</b>\n\n{}",
  922. "no_rules": "<emoji document_id=6053166094816905153>🚫</emoji> <b>보안 규칙 없음</b>",
  923. "owner_target": (
  924. "<emoji document_id=6053166094816905153>🚫</emoji> <b>이 사용자는"
  925. "소유자이며 보안 목적으로 관리할 수 없습니다.</b>"
  926. ),
  927. "rules_removed": (
  928. "<emoji document_id=5472308992514464048>🔐</emoji> <b>안전 규칙"
  929. "for <a href='{}'>{}</a>이(가) 삭제되었습니다</b>"
  930. ),
  931. **service_strings_kr,
  932. }
  933. strings_ar = {
  934. "owner_added": (
  935. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  936. ' href="tg://user?id={}">{}</a> </b><code>مالك</code>'
  937. "<b> تمت إضافته</b>"
  938. ),
  939. "sudo_added": (
  940. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  941. ' href="tg://user?id={}">{}</a> </b><code>سودو</code>'
  942. "<b> تمت إضافته</b>"
  943. ),
  944. "support_added": (
  945. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  946. ' href="tg://user?id={}">{}</a> </b><code>مساعد</code>'
  947. "<b> تمت إضافته</b>"
  948. ),
  949. "owner_removed": (
  950. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  951. ' href="tg://user?id={}">{}</a> </b><code>مالك</code>'
  952. "<b> تمت إزالته</b>"
  953. ),
  954. "sudo_removed": (
  955. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  956. ' href="tg://user?id={}">{}</a> </b><code>سودو</code>'
  957. "<b> تمت إزالته</b>"
  958. ),
  959. "support_removed": (
  960. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  961. ' href="tg://user?id={}">{}</a> </b><code>مساعد</code>'
  962. "<b> تمت إزالته</b>"
  963. ),
  964. "_cls_doc": "إدارة إعدادات الأمان",
  965. "what": (
  966. "<emoji document_id=6053166094816905153>🚫</emoji> <b>لم يتم"
  967. " العثور على الوسيط الأول (</b><code>user</code><b> أو </b>"
  968. "<code>chat</code><b>)</b>"
  969. ),
  970. "no_user": (
  971. "<emoji document_id=6053166094816905153>🚫</emoji> <b>لم يتم"
  972. " العثور على المستخدم</b>"
  973. ),
  974. "no_chat": (
  975. "<emoji document_id=6053166094816905153>🚫</emoji> <b>لم يتم"
  976. " العثور على الدردشة</b>"
  977. ),
  978. "what_rule": (
  979. "<emoji document_id=6053166094816905153>🚫</emoji> <b>لم يتم"
  980. " تحديد أي قاعدة (الوحدة أو الأمر)</b>"
  981. ),
  982. "no_rule": (
  983. "<emoji document_id=6053166094816905153>🚫</emoji> <b>لم يتم"
  984. " تحديد أي قاعدة (الوحدة أو الأمر)</b>"
  985. ),
  986. "confirm_rule": (
  987. "🔐 <b>هل أنت متأكد من أنك تريد {} <a href='{}'>{}</a> </b>"
  988. "<code>{}</code><b> {}</b>"
  989. ),
  990. "multiple_rules": "🔐 <b>إدارة قواعد الأمان</b>\n\n{}",
  991. "no_rules": (
  992. "<emoji document_id=6053166094816905153>🚫</emoji> <b>لا توجد قواعد أمان</b>"
  993. ),
  994. "owner_target": (
  995. "<emoji document_id=6053166094816905153>🚫</emoji> <b>لا يمكن"
  996. " إدارة هذا المستخدم لأنه مالك.</b>"
  997. ),
  998. "rules_removed": (
  999. "<emoji document_id=5472308992514464048>🔐</emoji> <b>تم"
  1000. " إزالة قواعد الأمان لـ <a href='{}'>{}</a></b>"
  1001. ),
  1002. **service_strings_ar,
  1003. }
  1004. strings_es = {
  1005. "owner_added": (
  1006. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  1007. ' href="tg://user?id={}">{}</a> </b><code>propietario</code>'
  1008. "<b> añadido</b>"
  1009. ),
  1010. "sudo_added": (
  1011. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  1012. ' href="tg://user?id={}">{}</a> </b><code>sudo</code>'
  1013. "<b> añadido</b>"
  1014. ),
  1015. "support_added": (
  1016. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  1017. ' href="tg://user?id={}">{}</a> </b><code>soporte</code>'
  1018. "<b> añadido</b>"
  1019. ),
  1020. "owner_removed": (
  1021. '<emoji document_id="5386399931378440814">😎</emoji> <b><a'
  1022. ' href="tg://user?id={}">{}</a> </b><code>propietario</code>'
  1023. "<b> eliminado</b>"
  1024. ),
  1025. "sudo_removed": (
  1026. '<emoji document_id="5418133868475587618">🧐</emoji> <b><a'
  1027. ' href="tg://user?id={}">{}</a> </b><code>sudo</code>'
  1028. "<b> eliminado</b>"
  1029. ),
  1030. "support_removed": (
  1031. '<emoji document_id="5415729507128580146">🤓</emoji> <b><a'
  1032. ' href="tg://user?id={}">{}</a> </b><code>soporte</code>'
  1033. "<b> eliminado</b>"
  1034. ),
  1035. "_cls_doc": "Administra los ajustes de seguridad",
  1036. "what": (
  1037. "<emoji document_id=6053166094816905153>🚫</emoji> <b>No se"
  1038. " encontró el primer medio (</b><code>usuario</code><b> o </b>"
  1039. "<code>chat</code><b>)</b>"
  1040. ),
  1041. "no_user": (
  1042. "<emoji document_id=6053166094816905153>🚫</emoji> <b>No se"
  1043. " encontró el usuario</b>"
  1044. ),
  1045. "no_chat": (
  1046. "<emoji document_id=6053166094816905153>🚫</emoji> <b>No se"
  1047. " encontró el chat</b>"
  1048. ),
  1049. "what_rule": (
  1050. "<emoji document_id=6053166094816905153>🚫</emoji> <b>No se"
  1051. " especificó ninguna regla (módulo o comando)</b>"
  1052. ),
  1053. "no_rule": (
  1054. "<emoji document_id=6053166094816905153>🚫</emoji> <b>No se"
  1055. " especificó ninguna regla (módulo o comando)</b>"
  1056. ),
  1057. "confirm_rule": (
  1058. "🔐 <b>¿Estás seguro de que quieres {} <a href='{}'>{}</a> </b>"
  1059. "<code>{}</code><b> {}</b>"
  1060. ),
  1061. "multiple_rules": "🔐 <b>Administración de reglas de seguridad</b>\n\n{}",
  1062. "no_rules": (
  1063. "<emoji document_id=6053166094816905153>🚫</emoji> <b>No hay"
  1064. " reglas de seguridad</b>"
  1065. ),
  1066. "owner_target": (
  1067. "<emoji document_id=6053166094816905153>🚫</emoji> <b>No se"
  1068. " puede administrar este usuario porque es el propietario.</b>"
  1069. ),
  1070. "rules_removed": (
  1071. "<emoji document_id=5472308992514464048>🔐</emoji> <b>Reglas"
  1072. " de seguridad eliminadas para <a href='{}'>{}</a></b>"
  1073. ),
  1074. **service_strings_es,
  1075. }
  1076. async def inline__switch_perm(
  1077. self,
  1078. call: InlineCall,
  1079. command: str,
  1080. group: str,
  1081. level: bool,
  1082. is_inline: bool,
  1083. ):
  1084. cmd = (
  1085. self.allmodules.inline_handlers[command]
  1086. if is_inline
  1087. else self.allmodules.commands[command]
  1088. )
  1089. mask = self._db.get(security.__name__, "masks", {}).get(
  1090. f"{cmd.__module__}.{cmd.__name__}",
  1091. getattr(cmd, "security", security.DEFAULT_PERMISSIONS),
  1092. )
  1093. bit = security.BITMAP[group.upper()]
  1094. if level:
  1095. mask |= bit
  1096. else:
  1097. mask &= ~bit
  1098. masks = self._db.get(security.__name__, "masks", {})
  1099. masks[f"{cmd.__module__}.{cmd.__name__}"] = mask
  1100. self._db.set(security.__name__, "masks", masks)
  1101. if (
  1102. not self._db.get(security.__name__, "bounding_mask", DEFAULT_PERMISSIONS)
  1103. & bit
  1104. and level
  1105. ):
  1106. await call.answer(
  1107. "Security value set but not applied. Consider enabling this value in"
  1108. f" .{'inlinesec' if is_inline else 'security'}",
  1109. show_alert=True,
  1110. )
  1111. else:
  1112. await call.answer("Security value set!")
  1113. await call.edit(
  1114. self.strings("permissions").format(
  1115. f"@{self.inline.bot_username} " if is_inline else self.get_prefix(),
  1116. command,
  1117. ),
  1118. reply_markup=self._build_markup(cmd, is_inline),
  1119. )
  1120. async def inline__switch_perm_bm(
  1121. self,
  1122. call: InlineCall,
  1123. group: str,
  1124. level: bool,
  1125. is_inline: bool,
  1126. ):
  1127. mask = self._db.get(security.__name__, "bounding_mask", DEFAULT_PERMISSIONS)
  1128. bit = security.BITMAP[group.upper()]
  1129. if level:
  1130. mask |= bit
  1131. else:
  1132. mask &= ~bit
  1133. self._db.set(security.__name__, "bounding_mask", mask)
  1134. await call.answer("Bounding mask value set!")
  1135. await call.edit(
  1136. self.strings("global"),
  1137. reply_markup=self._build_markup_global(is_inline),
  1138. )
  1139. def _build_markup(
  1140. self,
  1141. command: callable,
  1142. is_inline: bool = False,
  1143. ) -> typing.List[typing.List[dict]]:
  1144. perms = self._get_current_perms(command, is_inline)
  1145. return (
  1146. utils.chunks(
  1147. [
  1148. {
  1149. "text": f"{'✅' if level else '🚫'} {self.strings[group]}",
  1150. "callback": self.inline__switch_perm,
  1151. "args": (
  1152. command.__name__.rsplit("_inline_handler", maxsplit=1)[0],
  1153. group,
  1154. not level,
  1155. is_inline,
  1156. ),
  1157. }
  1158. for group, level in perms.items()
  1159. ],
  1160. 2,
  1161. )
  1162. + [[{"text": self.strings("close_menu"), "action": "close"}]]
  1163. if is_inline
  1164. else utils.chunks(
  1165. [
  1166. {
  1167. "text": f"{'✅' if level else '🚫'} {self.strings[group]}",
  1168. "callback": self.inline__switch_perm,
  1169. "args": (
  1170. command.__name__.rsplit("cmd", maxsplit=1)[0],
  1171. group,
  1172. not level,
  1173. is_inline,
  1174. ),
  1175. }
  1176. for group, level in perms.items()
  1177. ],
  1178. 2,
  1179. )
  1180. + [
  1181. [
  1182. {
  1183. "text": self.strings("close_menu"),
  1184. "action": "close",
  1185. }
  1186. ]
  1187. ]
  1188. )
  1189. def _build_markup_global(
  1190. self, is_inline: bool = False
  1191. ) -> typing.List[typing.List[dict]]:
  1192. perms = self._get_current_bm(is_inline)
  1193. return utils.chunks(
  1194. [
  1195. {
  1196. "text": f"{'✅' if level else '🚫'} {self.strings[group]}",
  1197. "callback": self.inline__switch_perm_bm,
  1198. "args": (group, not level, is_inline),
  1199. }
  1200. for group, level in perms.items()
  1201. ],
  1202. 2,
  1203. ) + [[{"text": self.strings("close_menu"), "action": "close"}]]
  1204. def _get_current_bm(self, is_inline: bool = False) -> dict:
  1205. return self._perms_map(
  1206. self._db.get(security.__name__, "bounding_mask", DEFAULT_PERMISSIONS),
  1207. is_inline,
  1208. )
  1209. @staticmethod
  1210. def _perms_map(perms: int, is_inline: bool) -> dict:
  1211. return (
  1212. {
  1213. "sudo": bool(perms & SUDO),
  1214. "support": bool(perms & SUPPORT),
  1215. "everyone": bool(perms & EVERYONE),
  1216. }
  1217. if is_inline
  1218. else {
  1219. "sudo": bool(perms & SUDO),
  1220. "support": bool(perms & SUPPORT),
  1221. "group_owner": bool(perms & GROUP_OWNER),
  1222. "group_admin_add_admins": bool(perms & GROUP_ADMIN_ADD_ADMINS),
  1223. "group_admin_change_info": bool(perms & GROUP_ADMIN_CHANGE_INFO),
  1224. "group_admin_ban_users": bool(perms & GROUP_ADMIN_BAN_USERS),
  1225. "group_admin_delete_messages": bool(
  1226. perms & GROUP_ADMIN_DELETE_MESSAGES
  1227. ),
  1228. "group_admin_pin_messages": bool(perms & GROUP_ADMIN_PIN_MESSAGES),
  1229. "group_admin_invite_users": bool(perms & GROUP_ADMIN_INVITE_USERS),
  1230. "group_admin": bool(perms & GROUP_ADMIN),
  1231. "group_member": bool(perms & GROUP_MEMBER),
  1232. "pm": bool(perms & PM),
  1233. "everyone": bool(perms & EVERYONE),
  1234. }
  1235. )
  1236. def _get_current_perms(
  1237. self,
  1238. command: callable,
  1239. is_inline: bool = False,
  1240. ) -> dict:
  1241. config = self._db.get(security.__name__, "masks", {}).get(
  1242. f"{command.__module__}.{command.__name__}",
  1243. getattr(command, "security", self._client.dispatcher.security.default),
  1244. )
  1245. return self._perms_map(config, is_inline)
  1246. @loader.owner
  1247. @loader.command(
  1248. ru_doc="[команда] - Настроить разрешения для команды",
  1249. de_doc="[command] - Einstellungen für Befehle ändern",
  1250. hi_doc="[command] - कमांड के लिए अनुमतियाँ सेट करें",
  1251. tr_doc="[command] - Komut için izinleri ayarla",
  1252. uz_doc="[command] - Buyruq uchun ruxsatlarini sozlash",
  1253. ja_doc="[command] - コマンドの権限を設定します",
  1254. kr_doc="[command] - 명령어 권한 설정",
  1255. ar_doc="[command] - تعيين الأذونات للأوامر",
  1256. es_doc="[command] - Configurar permisos para comandos",
  1257. )
  1258. async def security(self, message: Message):
  1259. """[command] - Configure command's security settings"""
  1260. args = utils.get_args_raw(message).lower().strip()
  1261. if args and args not in self.allmodules.commands:
  1262. await utils.answer(message, self.strings("no_command").format(args))
  1263. return
  1264. if not args:
  1265. await self.inline.form(
  1266. self.strings("global"),
  1267. reply_markup=self._build_markup_global(),
  1268. message=message,
  1269. ttl=5 * 60,
  1270. )
  1271. return
  1272. cmd = self.allmodules.commands[args]
  1273. await self.inline.form(
  1274. self.strings("permissions").format(self.get_prefix(), args),
  1275. reply_markup=self._build_markup(cmd),
  1276. message=message,
  1277. ttl=5 * 60,
  1278. )
  1279. @loader.owner
  1280. @loader.command(
  1281. ru_doc="[команда] - Настроить разрешения для инлайн команды",
  1282. de_doc="[command] - Einstellungen für Inline-Befehle ändern",
  1283. hi_doc="[command] - इनलाइन कमांड के लिए अनुमतियाँ सेट करें",
  1284. tr_doc="[command] - Inline komut için izinleri ayarla",
  1285. uz_doc="[command] - Inline buyruq uchun ruxsatlarini sozlash",
  1286. ja_doc="[command] - インラインコマンドの権限を設定します",
  1287. kr_doc="[command] - 인라인 명령어 권한 설정",
  1288. ar_doc="[command] - تعيين الأذونات للأوامر الخطية",
  1289. es_doc="[command] - Configurar permisos para comandos inline",
  1290. )
  1291. async def inlinesec(self, message: Message):
  1292. """[command] - Configure inline command's security settings"""
  1293. args = utils.get_args_raw(message).lower().strip()
  1294. if not args:
  1295. await self.inline.form(
  1296. self.strings("global"),
  1297. reply_markup=self._build_markup_global(True),
  1298. message=message,
  1299. ttl=5 * 60,
  1300. )
  1301. return
  1302. if args not in self.allmodules.inline_handlers:
  1303. await utils.answer(message, self.strings("no_command").format(args))
  1304. return
  1305. i_handler = self.allmodules.inline_handlers[args]
  1306. await self.inline.form(
  1307. self.strings("permissions").format(f"@{self.inline.bot_username} ", args),
  1308. reply_markup=self._build_markup(i_handler, True),
  1309. message=message,
  1310. ttl=5 * 60,
  1311. )
  1312. async def _resolve_user(self, message: Message):
  1313. reply = await message.get_reply_message()
  1314. args = utils.get_args_raw(message)
  1315. if not args and not reply:
  1316. await utils.answer(message, self.strings("no_user"))
  1317. return
  1318. user = None
  1319. if args:
  1320. try:
  1321. if str(args).isdigit():
  1322. args = int(args)
  1323. user = await self._client.get_entity(args)
  1324. except Exception:
  1325. pass
  1326. if user is None:
  1327. user = await self._client.get_entity(reply.sender_id)
  1328. if not isinstance(user, (User, PeerUser)):
  1329. await utils.answer(message, self.strings("not_a_user"))
  1330. return
  1331. if user.id == self.tg_id:
  1332. await utils.answer(message, self.strings("self"))
  1333. return
  1334. return user
  1335. async def _add_to_group(
  1336. self,
  1337. message: typing.Union[Message, InlineCall],
  1338. group: str,
  1339. confirmed: bool = False,
  1340. user: int = None,
  1341. ):
  1342. if user is None:
  1343. user = await self._resolve_user(message)
  1344. if not user:
  1345. return
  1346. if isinstance(user, int):
  1347. user = await self._client.get_entity(user)
  1348. if not confirmed:
  1349. await self.inline.form(
  1350. self.strings("warning").format(
  1351. user.id,
  1352. utils.escape_html(get_display_name(user)),
  1353. group,
  1354. ),
  1355. message=message,
  1356. ttl=10 * 60,
  1357. reply_markup=[
  1358. {
  1359. "text": self.strings("cancel"),
  1360. "action": "close",
  1361. },
  1362. {
  1363. "text": self.strings("confirm"),
  1364. "callback": self._add_to_group,
  1365. "args": (group, True, user.id),
  1366. },
  1367. ],
  1368. )
  1369. return
  1370. if user.id not in getattr(self._client.dispatcher.security, group):
  1371. getattr(self._client.dispatcher.security, group).append(user.id)
  1372. m = (
  1373. self.strings(f"{group}_added").format(
  1374. user.id,
  1375. utils.escape_html(get_display_name(user)),
  1376. )
  1377. + "\n\n"
  1378. + self.strings("suggest_nonick")
  1379. )
  1380. await utils.answer(message, m)
  1381. await message.edit(
  1382. m,
  1383. reply_markup=[
  1384. {
  1385. "text": self.strings("cancel"),
  1386. "action": "close",
  1387. },
  1388. {
  1389. "text": self.strings("enable_nonick_btn"),
  1390. "callback": self._enable_nonick,
  1391. "args": (user,),
  1392. },
  1393. ],
  1394. )
  1395. async def _enable_nonick(self, call: InlineCall, user: User):
  1396. self._db.set(
  1397. main.__name__,
  1398. "nonickusers",
  1399. list(set(self._db.get(main.__name__, "nonickusers", []) + [user.id])),
  1400. )
  1401. await call.edit(
  1402. self.strings("user_nn").format(
  1403. user.id,
  1404. utils.escape_html(get_display_name(user)),
  1405. )
  1406. )
  1407. await call.unload()
  1408. async def _remove_from_group(self, message: Message, group: str):
  1409. user = await self._resolve_user(message)
  1410. if not user:
  1411. return
  1412. if user.id in getattr(self._client.dispatcher.security, group):
  1413. getattr(self._client.dispatcher.security, group).remove(user.id)
  1414. m = self.strings(f"{group}_removed").format(
  1415. user.id,
  1416. utils.escape_html(get_display_name(user)),
  1417. )
  1418. await utils.answer(message, m)
  1419. async def _list_group(self, message: Message, group: str):
  1420. _resolved_users = []
  1421. for user in getattr(self._client.dispatcher.security, group) + (
  1422. [self.tg_id] if group == "owner" else []
  1423. ):
  1424. try:
  1425. _resolved_users += [await self._client.get_entity(user)]
  1426. except Exception:
  1427. pass
  1428. if _resolved_users:
  1429. await utils.answer(
  1430. message,
  1431. self.strings(f"{group}_list").format(
  1432. "\n".join(
  1433. [
  1434. self.strings("li").format(
  1435. i.id, utils.escape_html(get_display_name(i))
  1436. )
  1437. for i in _resolved_users
  1438. ]
  1439. )
  1440. ),
  1441. )
  1442. else:
  1443. await utils.answer(message, self.strings(f"no_{group}"))
  1444. @loader.command(
  1445. ru_doc="<пользователь> - Добавить пользователя в группу `sudo`",
  1446. de_doc="<Benutzer> - Füge Benutzer zur `sudo`-Gruppe hinzu",
  1447. hi_doc="<उपयोगकर्ता> - उपयोगकर्ता को `sudo` समूह में जोड़ें",
  1448. tr_doc="<kullanıcı> - Kullanıcıyı `sudo` grubuna ekle",
  1449. uz_doc="<foydalanuvchi> - Foydalanuvchini `sudo` guruhiga qo'shish",
  1450. ja_doc="<ユーザー> - ユーザーを `sudo` グループに追加",
  1451. kr_doc="<사용자> - 사용자를 `sudo` 그룹에 추가",
  1452. ar_doc="<مستخدم> - إضافة مستخدم إلى مجموعة `sudo`",
  1453. es_doc="<usuario> - Agregar usuario al grupo `sudo`",
  1454. )
  1455. async def sudoadd(self, message: Message):
  1456. """<user> - Add user to `sudo`"""
  1457. await self._add_to_group(message, "sudo")
  1458. @loader.command(
  1459. ru_doc="<пользователь> - Добавить пользователя в группу `owner`",
  1460. de_doc="<Benutzer> - Füge Benutzer zur `owner`-Gruppe hinzu",
  1461. hi_doc="<उपयोगकर्ता> - उपयोगकर्ता को `owner` समूह में जोड़ें",
  1462. tr_doc="<kullanıcı> - Kullanıcıyı `owner` grubuna ekle",
  1463. uz_doc="<foydalanuvchi> - Foydalanuvchini `owner` guruhiga qo'shish",
  1464. ja_doc="<ユーザー> - ユーザーを `owner` グループに追加",
  1465. kr_doc="<사용자> - 사용자를 `owner` 그룹에 추가",
  1466. ar_doc="<مستخدم> - إضافة مستخدم إلى مجموعة `owner`",
  1467. es_doc="<usuario> - Agregar usuario al grupo `owner`",
  1468. )
  1469. async def owneradd(self, message: Message):
  1470. """<user> - Add user to `owner`"""
  1471. await self._add_to_group(message, "owner")
  1472. @loader.command(
  1473. ru_doc="<пользователь> - Добавить пользователя в группу `support`",
  1474. de_doc="<Benutzer> - Füge Benutzer zur `support`-Gruppe hinzu",
  1475. hi_doc="<उपयोगकर्ता> - उपयोगकर्ता को `support` समूह में जोड़ें",
  1476. tr_doc="<kullanıcı> - Kullanıcıyı `support` grubuna ekle",
  1477. uz_doc="<foydalanuvchi> - Foydalanuvchini `support` guruhiga qo'shish",
  1478. ja_doc="<ユーザー> - ユーザーを `support` グループに追加",
  1479. kr_doc="<사용자> - 사용자를 `support` 그룹에 추가",
  1480. ar_doc="<مستخدم> - إضافة مستخدم إلى مجموعة `support`",
  1481. es_doc="<usuario> - Agregar usuario al grupo `support`",
  1482. )
  1483. async def supportadd(self, message: Message):
  1484. """<user> - Add user to `support`"""
  1485. await self._add_to_group(message, "support")
  1486. @loader.command(
  1487. ru_doc="<пользователь> - Удалить пользователя из группы `sudo`",
  1488. de_doc="<Benutzer> - Entferne Benutzer aus der `sudo`-Gruppe",
  1489. hi_doc="<उपयोगकर्ता> - उपयोगकर्ता को `sudo` समूह से हटा दें",
  1490. tr_doc="<kullanıcı> - Kullanıcıyı `sudo` grubundan kaldır",
  1491. uz_doc="<foydalanuvchi> - Foydalanuvchini `sudo` guruhidan olib tashlash",
  1492. ja_doc="<ユーザー> - ユーザーを `sudo` グループから削除",
  1493. kr_doc="<사용자> - 사용자를 `sudo` 그룹에서 제거",
  1494. ar_doc="<مستخدم> - إزالة مستخدم من مجموعة `sudo`",
  1495. es_doc="<usuario> - Eliminar usuario del grupo `sudo`",
  1496. )
  1497. async def sudorm(self, message: Message):
  1498. """<user> - Remove user from `sudo`"""
  1499. await self._remove_from_group(message, "sudo")
  1500. @loader.command(
  1501. ru_doc="<пользователь> - Удалить пользователя из группы `owner`",
  1502. de_doc="<Benutzer> - Entferne Benutzer aus der `owner`-Gruppe",
  1503. hi_doc="<उपयोगकर्ता> - उपयोगकर्ता को `owner` समूह से हटा दें",
  1504. tr_doc="<kullanıcı> - Kullanıcıyı `owner` grubundan kaldır",
  1505. uz_doc="<foydalanuvchi> - Foydalanuvchini `owner` guruhidan olib tashlash",
  1506. ja_doc="<ユーザー> - ユーザーを `owner` グループから削除",
  1507. kr_doc="<사용자> - 사용자를 `owner` 그룹에서 제거",
  1508. ar_doc="<مستخدم> - إزالة مستخدم من مجموعة `owner`",
  1509. es_doc="<usuario> - Eliminar usuario del grupo `owner`",
  1510. )
  1511. async def ownerrm(self, message: Message):
  1512. """<user> - Remove user from `owner`"""
  1513. await self._remove_from_group(message, "owner")
  1514. @loader.command(
  1515. ru_doc="<пользователь> - Удалить пользователя из группы `support`",
  1516. de_doc="<Benutzer> - Entferne Benutzer aus der `support`-Gruppe",
  1517. hi_doc="<उपयोगकर्ता> - उपयोगकर्ता को `support` समूह से हटा दें",
  1518. tr_doc="<kullanıcı> - Kullanıcıyı `support` grubundan kaldır",
  1519. uz_doc="<foydalanuvchi> - Foydalanuvchini `support` guruhidan olib tashlash",
  1520. ja_doc="<ユーザー> - ユーザーを `support` グループから削除",
  1521. kr_doc="<사용자> - 사용자를 `support` 그룹에서 제거",
  1522. ar_doc="<مستخدم> - إزالة مستخدم من مجموعة `support`",
  1523. es_doc="<usuario> - Eliminar usuario del grupo `support`",
  1524. )
  1525. async def supportrm(self, message: Message):
  1526. """<user> - Remove user from `support`"""
  1527. await self._remove_from_group(message, "support")
  1528. @loader.command(
  1529. ru_doc="Показать список пользователей в группе `sudo`",
  1530. de_doc="Zeige Liste der Benutzer in der `sudo`-Gruppe",
  1531. hi_doc="उपयोगकर्ताओं की सूची दिखाएं `sudo` समूह में",
  1532. tr_doc="`sudo` grubundaki kullanıcıların listesini göster",
  1533. uz_doc="`sudo` guruhidagi foydalanuvchilar ro'yxatini ko'rsatish",
  1534. ja_doc="`sudo` グループのユーザー一覧を表示",
  1535. kr_doc="`sudo` 그룹의 사용자 목록 표시",
  1536. ar_doc="عرض قائمة المستخدمين في مجموعة `sudo`",
  1537. es_doc="Mostrar lista de usuarios en el grupo `sudo`",
  1538. )
  1539. async def sudolist(self, message: Message):
  1540. """List users in `sudo`"""
  1541. await self._list_group(message, "sudo")
  1542. @loader.command(
  1543. ru_doc="Показать список пользователей в группе `owner`",
  1544. de_doc="Zeige Liste der Benutzer in der `owner`-Gruppe",
  1545. hi_doc="उपयोगकर्ताओं की सूची दिखाएं `owner` समूह में",
  1546. tr_doc="`owner` grubundaki kullanıcıların listesini göster",
  1547. uz_doc="`owner` guruhidagi foydalanuvchilar ro'yxatini ko'rsatish",
  1548. ja_doc="`owner` グループのユーザー一覧を表示",
  1549. kr_doc="`owner` 그룹의 사용자 목록 표시",
  1550. ar_doc="عرض قائمة المستخدمين في مجموعة `owner`",
  1551. es_doc="Mostrar lista de usuarios en el grupo `owner`",
  1552. )
  1553. async def ownerlist(self, message: Message):
  1554. """List users in `owner`"""
  1555. await self._list_group(message, "owner")
  1556. @loader.command(
  1557. ru_doc="Показать список пользователей в группе `support`",
  1558. de_doc="Zeige Liste der Benutzer in der `support`-Gruppe",
  1559. hi_doc="उपयोगकर्ताओं की सूची दिखाएं `support` समूह में",
  1560. tr_doc="`support` grubundaki kullanıcıların listesini göster",
  1561. uz_doc="`support` guruhidagi foydalanuvchilar ro'yxatini ko'rsatish",
  1562. ja_doc="`support` グループのユーザー一覧を表示",
  1563. kr_doc="`support` 그룹의 사용자 목록 표시",
  1564. ar_doc="عرض قائمة المستخدمين في مجموعة `support`",
  1565. es_doc="Mostrar lista de usuarios en el grupo `support`",
  1566. )
  1567. async def supportlist(self, message: Message):
  1568. """List users in `support`"""
  1569. await self._list_group(message, "support")
  1570. def _lookup(self, needle: str) -> str:
  1571. return (
  1572. []
  1573. if needle.lower().startswith(self.get_prefix())
  1574. else (
  1575. [f"module/{self.lookup(needle).__class__.__name__}"]
  1576. if self.lookup(needle)
  1577. else []
  1578. )
  1579. ) + (
  1580. [f"command/{needle.lower().strip(self.get_prefix())}"]
  1581. if needle.lower().strip(self.get_prefix()) in self.allmodules.commands
  1582. else []
  1583. )
  1584. @staticmethod
  1585. def _extract_time(args: list) -> int:
  1586. suffixes = {
  1587. "d": 24 * 60 * 60,
  1588. "h": 60 * 60,
  1589. "m": 60,
  1590. "s": 1,
  1591. }
  1592. for suffix, quantifier in suffixes.items():
  1593. duration = next(
  1594. (
  1595. int(arg.rsplit(suffix, maxsplit=1)[0])
  1596. for arg in args
  1597. if arg.endswith(suffix)
  1598. and arg.rsplit(suffix, maxsplit=1)[0].isdigit()
  1599. ),
  1600. None,
  1601. )
  1602. if duration is not None:
  1603. return duration * quantifier
  1604. return 0
  1605. def _convert_time(self, duration: int) -> str:
  1606. return (
  1607. self.strings("forever")
  1608. if not duration or duration < 0
  1609. else (
  1610. (
  1611. f"{duration // (24 * 60 * 60)} "
  1612. + self.strings(
  1613. f"day{'s' if duration // (24 * 60 * 60) > 1 else ''}"
  1614. )
  1615. )
  1616. if duration >= 24 * 60 * 60
  1617. else (
  1618. (
  1619. f"{duration // (60 * 60)} "
  1620. + self.strings(
  1621. f"hour{'s' if duration // (60 * 60) > 1 else ''}"
  1622. )
  1623. )
  1624. if duration >= 60 * 60
  1625. else (
  1626. (
  1627. f"{duration // 60} "
  1628. + self.strings(f"minute{'s' if duration // 60 > 1 else ''}")
  1629. )
  1630. if duration >= 60
  1631. else (
  1632. f"{duration} "
  1633. + self.strings(f"second{'s' if duration > 1 else ''}")
  1634. )
  1635. )
  1636. )
  1637. )
  1638. )
  1639. async def _add_rule(
  1640. self,
  1641. call: InlineCall,
  1642. target_type: str,
  1643. target: EntityLike,
  1644. rule: str,
  1645. duration: int,
  1646. ):
  1647. self._client.dispatcher.security.add_rule(
  1648. target_type,
  1649. target,
  1650. rule,
  1651. duration,
  1652. )
  1653. await call.edit(
  1654. self.strings("rule_added").format(
  1655. self.strings(target_type),
  1656. utils.get_entity_url(target),
  1657. utils.escape_html(get_display_name(target)),
  1658. self.strings(rule.split("/", maxsplit=1)[0]),
  1659. rule.split("/", maxsplit=1)[1],
  1660. (self.strings("for") + " " + self._convert_time(duration))
  1661. if duration
  1662. else self.strings("forever"),
  1663. )
  1664. )
  1665. async def _confirm(
  1666. self,
  1667. obj: typing.Union[Message, InlineMessage],
  1668. target_type: str,
  1669. target: EntityLike,
  1670. rule: str,
  1671. duration: int,
  1672. ):
  1673. await utils.answer(
  1674. obj,
  1675. self.strings("confirm_rule").format(
  1676. self.strings(target_type),
  1677. utils.get_entity_url(target),
  1678. utils.escape_html(get_display_name(target)),
  1679. self.strings(rule.split("/", maxsplit=1)[0]),
  1680. rule.split("/", maxsplit=1)[1],
  1681. (self.strings("for") + " " + self._convert_time(duration))
  1682. if duration
  1683. else self.strings("forever"),
  1684. ),
  1685. reply_markup=[
  1686. {
  1687. "text": self.strings("confirm_btn"),
  1688. "callback": self._add_rule,
  1689. "args": (target_type, target, rule, duration),
  1690. },
  1691. {"text": self.strings("cancel_btn"), "action": "close"},
  1692. ],
  1693. )
  1694. async def _tsec_chat(self, message: Message, args: list):
  1695. if len(args) == 1 and message.is_private:
  1696. await utils.answer(message, self.strings("no_target"))
  1697. return
  1698. if len(args) >= 2:
  1699. try:
  1700. if not args[1].isdigit() and not args[1].startswith("@"):
  1701. raise ValueError
  1702. target = await self._client.get_entity(
  1703. int(args[1]) if args[1].isdigit() else args[1]
  1704. )
  1705. except (ValueError, TypeError):
  1706. if not message.is_private:
  1707. target = await self._client.get_entity(message.peer_id)
  1708. else:
  1709. await utils.answer(message, self.strings("no_target"))
  1710. return
  1711. duration = self._extract_time(args)
  1712. possible_rules = utils.array_sum([self._lookup(arg) for arg in args])
  1713. if not possible_rules:
  1714. await utils.answer(message, self.strings("no_rule"))
  1715. return
  1716. if len(possible_rules) > 1:
  1717. def case(text: str) -> str:
  1718. return text.upper()[0] + text[1:]
  1719. await self.inline.form(
  1720. message=message,
  1721. text=self.strings("multiple_rules").format(
  1722. "\n".join(
  1723. "🛡 <b>{} </b><code>{}</code>".format(
  1724. case(self.strings(rule.split("/")[0])),
  1725. rule.split("/", maxsplit=1)[1],
  1726. )
  1727. for rule in possible_rules
  1728. )
  1729. ),
  1730. reply_markup=utils.chunks(
  1731. [
  1732. {
  1733. "text": "🛡 {} {}".format(
  1734. case(self.strings(rule.split("/")[0])),
  1735. rule.split("/", maxsplit=1)[1],
  1736. ),
  1737. "callback": self._confirm,
  1738. "args": ("chat", target, rule, duration),
  1739. }
  1740. for rule in possible_rules
  1741. ],
  1742. 3,
  1743. ),
  1744. )
  1745. return
  1746. await self._confirm(message, "chat", target, possible_rules[0], duration)
  1747. async def _tsec_user(self, message: Message, args: list):
  1748. if len(args) == 1 and not message.is_private and not message.is_reply:
  1749. await utils.answer(message, self.strings("no_target"))
  1750. return
  1751. if len(args) >= 2:
  1752. try:
  1753. if not args[1].isdigit() and not args[1].startswith("@"):
  1754. raise ValueError
  1755. target = await self._client.get_entity(
  1756. int(args[1]) if args[1].isdigit() else args[1]
  1757. )
  1758. except (ValueError, TypeError):
  1759. if message.is_private:
  1760. target = await self._client.get_entity(message.peer_id)
  1761. elif message.is_reply:
  1762. target = await self._client.get_entity(
  1763. (await message.get_reply_message()).sender_id
  1764. )
  1765. else:
  1766. await utils.answer(message, self.strings("no_target"))
  1767. return
  1768. if target.id in self._client.dispatcher.security.owner:
  1769. await utils.answer(message, self.strings("owner_target"))
  1770. return
  1771. duration = self._extract_time(args)
  1772. possible_rules = utils.array_sum([self._lookup(arg) for arg in args])
  1773. if not possible_rules:
  1774. await utils.answer(message, self.strings("no_rule"))
  1775. return
  1776. if len(possible_rules) > 1:
  1777. def case(text: str) -> str:
  1778. return text.upper()[0] + text[1:]
  1779. await self.inline.form(
  1780. message=message,
  1781. text=self.strings("multiple_rules").format(
  1782. "\n".join(
  1783. "🛡 <b>{} </b><code>{}</code>".format(
  1784. case(self.strings(rule.split("/")[0])),
  1785. rule.split("/", maxsplit=1)[1],
  1786. )
  1787. for rule in possible_rules
  1788. )
  1789. ),
  1790. reply_markup=utils.chunks(
  1791. [
  1792. {
  1793. "text": "🛡 {} {}".format(
  1794. case(self.strings(rule.split("/")[0])),
  1795. rule.split("/", maxsplit=1)[1],
  1796. ),
  1797. "callback": self._confirm,
  1798. "args": ("user", target, rule, duration),
  1799. }
  1800. for rule in possible_rules
  1801. ],
  1802. 3,
  1803. ),
  1804. )
  1805. return
  1806. await self._confirm(message, "user", target, possible_rules[0], duration)
  1807. @loader.command(
  1808. ru_doc='<"user"/"chat"> - Удалить правило таргетированной безопасности',
  1809. de_doc='<"user"/"chat"> - Entferne eine Regel für die gezielte Sicherheit',
  1810. tr_doc='<"user"/"chat"> - Hedefli güvenlik için bir kural kaldırın',
  1811. hi_doc='<"user"/"chat"> - लक्षित सुरक्षा के लिए एक नियम निकालें',
  1812. uz_doc='<"user"/"chat"> - Maqsadli xavfsizlik uchun bir qoidani olib tashlang',
  1813. ja_doc='<"user"/"chat"> - 対象セキュリティのルールを削除します',
  1814. kr_doc='<"user"/"chat"> - 대상 보안 규칙을 제거합니다',
  1815. ar_doc='<"user"/"chat"> - إزالة قاعدة أمنية مستهدفة',
  1816. es_doc='<"user"/"chat"> - Eliminar una regla de seguridad dirigida',
  1817. )
  1818. async def tsecrm(self, message: Message):
  1819. """<"user"/"chat"> - Remove targeted security rule"""
  1820. if (
  1821. not self._client.dispatcher.security.tsec_chat
  1822. and not self._client.dispatcher.security.tsec_user
  1823. ):
  1824. await utils.answer(message, self.strings("no_rules"))
  1825. return
  1826. args = utils.get_args_raw(message)
  1827. if not args or args not in {"user", "chat"}:
  1828. await utils.answer(message, self.strings("no_target"))
  1829. return
  1830. if args == "user":
  1831. if not message.is_private and not message.is_reply:
  1832. await utils.answer(message, self.strings("no_target"))
  1833. return
  1834. if message.is_private:
  1835. target = await self._client.get_entity(message.peer_id)
  1836. elif message.is_reply:
  1837. target = await self._client.get_entity(
  1838. (await message.get_reply_message()).sender_id
  1839. )
  1840. if not self._client.dispatcher.security.remove_rules("user", target.id):
  1841. await utils.answer(message, self.strings("no_rules"))
  1842. return
  1843. await utils.answer(
  1844. message,
  1845. self.strings("rules_removed").format(
  1846. utils.get_entity_url(target),
  1847. utils.escape_html(get_display_name(target)),
  1848. ),
  1849. )
  1850. return
  1851. if message.is_private:
  1852. await utils.answer(message, self.strings("no_target"))
  1853. return
  1854. target = await self._client.get_entity(message.peer_id)
  1855. if not self._client.dispatcher.security.remove_rules("chat", target.id):
  1856. await utils.answer(message, self.strings("no_rules"))
  1857. return
  1858. await utils.answer(
  1859. message,
  1860. self.strings("rules_removed").format(
  1861. utils.get_entity_url(target),
  1862. utils.escape_html(get_display_name(target)),
  1863. ),
  1864. )
  1865. @loader.command(
  1866. ru_doc=(
  1867. '<"user"/"chat"> [цель - пользователь или чат] [правило - команда или'
  1868. " модуль] [время] - Настроить таргетированную безопасность"
  1869. ),
  1870. de_doc=(
  1871. '<"user"/"chat"> [Ziel - Benutzer oder Chat] [Regel - Befehl oder'
  1872. " Modul] [Zeit] - Targeted-Sicherheit einstellen"
  1873. ),
  1874. tr_doc=(
  1875. '<"user"/"chat"> [hedef - kullanıcı veya sohbet] [kural - komut veya'
  1876. " modül] [zaman] - Hedefli güvenliği ayarla"
  1877. ),
  1878. hi_doc=(
  1879. '<"user"/"chat"> [लक्ष्य - उपयोगकर्ता या चैट] [नियम - कमांड या'
  1880. " मॉड्यूल] [समय] - लक्षित सुरक्षा सेट करें"
  1881. ),
  1882. uz_doc=(
  1883. '<"user"/"chat"> [maqsad - foydalanuvchi yoki chat] [qoida - buyruq yoki'
  1884. " modul] [vaqt] - Maqsadli xavfsizlikni sozlash"
  1885. ),
  1886. ja_doc=(
  1887. '<"user"/"chat"> [ターゲット - ユーザーまたはチャット] [ルール - コマンドまたは'
  1888. " モジュール] [時間] - ターゲットセキュリティを設定します"
  1889. ),
  1890. kr_doc='<"user"/"chat"> [대상 - 사용자 또는 채팅] [규칙 - 명령 또는 모듈] [시간] - 타겟 보안 설정',
  1891. ar_doc=(
  1892. '<"user"/"chat"> [الهدف - المستخدم أو الدردشة] [القاعدة - الأمر أو'
  1893. " وحدة] [الوقت] - تعيين الأمن المستهدف"
  1894. ),
  1895. es_doc=(
  1896. '<"user"/"chat"> [objetivo - usuario o chat] [regla - comando o'
  1897. " módulo] [tiempo] - Establecer seguridad dirigida"
  1898. ),
  1899. )
  1900. async def tsec(self, message: Message):
  1901. """<"user"/"chat"> [target user or chat] [rule (command/module)] [time] - Add new targeted security rule
  1902. """
  1903. args = utils.get_args(message)
  1904. if not args:
  1905. if (
  1906. not self._client.dispatcher.security.tsec_chat
  1907. and not self._client.dispatcher.security.tsec_user
  1908. ):
  1909. await utils.answer(message, self.strings("no_rules"))
  1910. return
  1911. await utils.answer(
  1912. message,
  1913. self.strings("rules").format(
  1914. "\n".join(
  1915. [
  1916. "<emoji document_id=6037355667365300960>👥</emoji> <b><a"
  1917. " href='{}'>{}</a> {} {} {}</b> <code>{}</code>".format(
  1918. rule["entity_url"],
  1919. utils.escape_html(rule["entity_name"]),
  1920. self._convert_time(int(rule["expires"] - time.time())),
  1921. self.strings("for"),
  1922. self.strings(rule["rule_type"]),
  1923. rule["rule"],
  1924. )
  1925. for rule in self._client.dispatcher.security.tsec_chat
  1926. ]
  1927. + [
  1928. "<emoji document_id=6037122016849432064>👤</emoji> <b><a"
  1929. " href='{}'>{}</a> {} {} {}</b> <code>{}</code>".format(
  1930. rule["entity_url"],
  1931. utils.escape_html(rule["entity_name"]),
  1932. self._convert_time(int(rule["expires"] - time.time())),
  1933. self.strings("for"),
  1934. self.strings(rule["rule_type"]),
  1935. rule["rule"],
  1936. )
  1937. for rule in self._client.dispatcher.security.tsec_user
  1938. ]
  1939. )
  1940. ),
  1941. )
  1942. return
  1943. if args[0] not in {"user", "chat"}:
  1944. await utils.answer(message, self.strings("what"))
  1945. return
  1946. await getattr(self, f"_tsec_{args[0]}")(message, args)