api_protection.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. # █ █ ▀ █▄▀ ▄▀█ █▀█ ▀
  2. # █▀█ █ █ █ █▀█ █▀▄ █
  3. # © Copyright 2022
  4. # https://t.me/hikariatama
  5. #
  6. # 🔒 Licensed under the GNU AGPLv3
  7. # 🌐 https://www.gnu.org/licenses/agpl-3.0.html
  8. import asyncio
  9. import io
  10. import json
  11. import logging
  12. import time
  13. from telethon.tl.types import Message
  14. from telethon.tl import functions
  15. from telethon.tl.tlobject import TLRequest
  16. from .. import loader, utils
  17. from ..inline.types import InlineCall
  18. logger = logging.getLogger(__name__)
  19. GROUPS = [
  20. "auth",
  21. "account",
  22. "users",
  23. "contacts",
  24. "messages",
  25. "updates",
  26. "photos",
  27. "upload",
  28. "help",
  29. "channels",
  30. "bots",
  31. "payments",
  32. "stickers",
  33. "phone",
  34. "langpack",
  35. "folders",
  36. "stats",
  37. ]
  38. def decapitalize(string: str) -> str:
  39. return string[0].lower() + string[1:]
  40. CONSTRUCTORS = {
  41. decapitalize(
  42. method.__class__.__name__.rsplit("Request", 1)[0]
  43. ): method.CONSTRUCTOR_ID
  44. for method in utils.array_sum(
  45. [
  46. [
  47. method
  48. for method in dir(getattr(functions, group))
  49. if isinstance(method, TLRequest)
  50. ]
  51. for group in GROUPS
  52. ]
  53. )
  54. }
  55. @loader.tds
  56. class APIRatelimiterMod(loader.Module):
  57. """Helps userbot avoid spamming Telegram API"""
  58. strings = {
  59. "name": "APILimiter",
  60. "warning": (
  61. "<emoji document_id=6319093650693293883>☣️</emoji>"
  62. " <b>WARNING!</b>\n\nYour account exceeded the limit of requests, specified"
  63. " in config. In order to prevent Telegram API Flood, userbot has been"
  64. " <b>fully frozen</b> for {} seconds. Further info is provided in attached"
  65. " file. \n\nIt is recommended to get help in <code>{prefix}support</code>"
  66. " group!\n\nIf you think, that it is an intended behavior, then wait until"
  67. " userbot gets unlocked and next time, when you will be going to perform"
  68. " such an operation, use <code>{prefix}suspend_api_protect</code> &lt;time"
  69. " in seconds&gt;"
  70. ),
  71. "args_invalid": (
  72. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Invalid arguments</b>"
  73. ),
  74. "suspended_for": (
  75. "<emoji document_id=5458450833857322148>👌</emoji> <b>API Flood Protection"
  76. " is disabled for {} seconds</b>"
  77. ),
  78. "test": (
  79. "<emoji document_id=6319093650693293883>☣️</emoji> <b>This action will"
  80. " expose your account to flooding Telegram API.</b> <i>In order to confirm,"
  81. " that you really know, what you are doing, complete this simple test -"
  82. " find the emoji, differing from others</i>"
  83. ),
  84. "on": (
  85. "<emoji document_id=5458450833857322148>👌</emoji> <b>Protection enabled</b>"
  86. ),
  87. "off": (
  88. "<emoji document_id=5458450833857322148>👌</emoji> <b>Protection"
  89. " disabled</b>"
  90. ),
  91. "u_sure": (
  92. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Are you sure?</b>"
  93. ),
  94. "_cfg_time_sample": "Time sample through which the bot will count requests",
  95. "_cfg_threshold": "Threshold of requests to trigger protection",
  96. "_cfg_local_floodwait": (
  97. "Freeze userbot for this amount of time, if request limit exceeds"
  98. ),
  99. "_cfg_forbidden_methods": (
  100. "Forbid specified methods from being executed throughout external modules"
  101. ),
  102. "btn_no": "🚫 No",
  103. "btn_yes": "✅ Yes",
  104. }
  105. strings_ru = {
  106. "warning": (
  107. "<emoji document_id=6319093650693293883>☣️</emoji>"
  108. " <b>ВНИМАНИЕ!</b>\n\nАккаунт вышел за лимиты запросов, указанные в"
  109. " конфиге. С целью предотвращения флуда Telegram API, юзербот был"
  110. " <b>полностью заморожен</b> на {} секунд. Дополнительная информация"
  111. " прикреплена в файле ниже. \n\nРекомендуется обратиться за помощью в"
  112. " <code>{prefix}support</code> группу!\n\nЕсли ты считаешь, что это"
  113. " запланированное поведение юзербота, просто подожди, пока закончится"
  114. " таймер и в следующий раз, когда запланируешь выполнять такую"
  115. " ресурсозатратную операцию, используй"
  116. " <code>{prefix}suspend_api_protect</code> &lt;время в секундах&gt;"
  117. ),
  118. "args_invalid": (
  119. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Неверные"
  120. " аргументы</b>"
  121. ),
  122. "suspended_for": (
  123. "<emoji document_id=5458450833857322148>👌</emoji> <b>Защита API отключена"
  124. " на {} секунд</b>"
  125. ),
  126. "test": (
  127. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Это действие"
  128. " открывает юзерботу возможность флудить Telegram API.</b> <i>Для того,"
  129. " чтобы убедиться, что ты действительно уверен в том, что делаешь - реши"
  130. " простенький тест - найди отличающийся эмодзи.</i>"
  131. ),
  132. "on": "<emoji document_id=5458450833857322148>👌</emoji> <b>Защита включена</b>",
  133. "off": (
  134. "<emoji document_id=5458450833857322148>👌</emoji> <b>Защита отключена</b>"
  135. ),
  136. "u_sure": "<emoji document_id=6319093650693293883>☣️</emoji> <b>Ты уверен?</b>",
  137. "_cfg_time_sample": (
  138. "Временной промежуток, по которому будет считаться количество запросов"
  139. ),
  140. "_cfg_threshold": "Порог запросов, при котором будет срабатывать защита",
  141. "_cfg_local_floodwait": (
  142. "Заморозить юзербота на это количество секунд, если лимит запросов превышен"
  143. ),
  144. "_cfg_forbidden_methods": (
  145. "Запретить выполнение указанных методов во всех внешних модулях"
  146. ),
  147. "btn_no": "🚫 Нет",
  148. "btn_yes": "✅ Да",
  149. }
  150. strings_de = {
  151. "warning": (
  152. "<emoji document_id=6319093650693293883>☣️</emoji>"
  153. " <b>Achtung!</b>\n\nDas Konto hat die in der Konfiguration angegebenen"
  154. " Grenzwerte für Anfragen überschritten. Um Telegram API-Flooding zu"
  155. " verhindern, wurde der <b>ganze Userbot</b> für {} Sekunden"
  156. " eingefroren. Weitere Informationen finden Sie im unten angefügten"
  157. " Datei.\n\nWir empfehlen Ihnen, sich mit Hilfe der <code>{prefix}"
  158. "support</code> Gruppe zu helfen!\n\nWenn du denkst, dass dies"
  159. " geplantes Verhalten des Userbots ist, dann warte einfach, bis der"
  160. " Timer abläuft und versuche beim nächsten Mal, eine so ressourcen"
  161. " intensive Operation wie <code>{prefix}suspend_api_protect</code>"
  162. " &lt;Zeit in Sekunden&gt; zu planen."
  163. ),
  164. "args_invalid": (
  165. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Ungültige"
  166. " Argumente</b>"
  167. ),
  168. "suspended_for": (
  169. "<emoji document_id=5458450833857322148>👌</emoji> <b>API Flood"
  170. " Protection ist für {} Sekunden deaktiviert</b>"
  171. ),
  172. "test": (
  173. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Dieser"
  174. " Vorgang wird deinen Account ermöglichen, die Telegram API zu"
  175. " überfluten.</b> <i>Um sicherzustellen, dass du wirklich weißt, was"
  176. " du tust, beende diesen einfachen Test - findest du das Emoji, das von"
  177. " den anderen abweicht?</i>"
  178. ),
  179. "on": (
  180. "<emoji document_id=5458450833857322148>👌</emoji> <b>Schutz aktiviert</b>"
  181. ),
  182. "off": (
  183. "<emoji document_id=5458450833857322148>👌</emoji> <b>Schutz deaktiviert</b>"
  184. ),
  185. "u_sure": (
  186. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Bist du sicher?</b>"
  187. ),
  188. "_cfg_time_sample": "Zeitintervall, in dem die Anfragen gezählt werden",
  189. "_cfg_threshold": (
  190. "Schwellenwert für Anfragen, ab dem der Schutz aktiviert wird"
  191. ),
  192. "_cfg_local_floodwait": (
  193. "Einfrieren des Userbots für diese Anzahl von Sekunden, wenn der Grenzwert"
  194. " überschritten wird"
  195. ),
  196. "_cfg_forbidden_methods": "Verbotene Methoden in allen externen Modulen",
  197. "btn_no": "🚫 Nein",
  198. "btn_yes": "✅ Ja",
  199. }
  200. strings_tr = {
  201. "warning": (
  202. "<emoji document_id=6319093650693293883>☣️</emoji>"
  203. " <b>Dikkat!</b>\n\nHesabın ayarlarda belirtilmiş istek sınırını aştı."
  204. " Telegram API Flood’unu önlemek için tüm <b>kullanıcı botu<b> {} saniye"
  205. " boyunca durduruldu. Daha fazla bilgi almak için ekteki dosyayı"
  206. " inceleyebilirsiniz. /n/ Ayrıca <code>{prefix}Destek</code> grubundan"
  207. " yardım almanız önerilmektedir. Eğer bu işlemin kasıtlı bir işlem olduğunu"
  208. " düşünüyorsanız, kullanıcı botunuzun açılmasının bekleyin ve bu tarz bir"
  209. " işlem gerçekleştireceğiniz sıradaki sefer"
  210. " <code>{prefix}suspend_api_protect</code> &lt;saniye&gt; kodunu kullanın."
  211. ),
  212. "args_invalid": (
  213. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Geçersiz"
  214. " argümanlar</b>"
  215. ),
  216. "suspended_for": (
  217. "<emoji document_id=5458450833857322148>👌</emoji> <b>API Flood koruması {}"
  218. " saniyeliğine durduruldu.</b>"
  219. ),
  220. "test": (
  221. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Bu eylem"
  222. " Thesabınızın Telegram API Flood’u yapabilmesine izin verecektir.</b>"
  223. " <i>Ne yaptığını bildiğinizi onaylamak için bu basit testi çözün."
  224. " - Diğerlerinden farklı olan emojiyi seç</i>"
  225. ),
  226. "on": (
  227. "<emoji document_id=5458450833857322148>👌</emoji> <b>Koruma"
  228. " aktifleştirildi.</b>"
  229. ),
  230. "off": (
  231. "<emoji document_id=5458450833857322148>👌</emoji> <b>Koruma"
  232. " de-aktifleştirildi</b>"
  233. ),
  234. "u_sure": (
  235. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Emin misin?</b>"
  236. ),
  237. "_cfg_time_sample": "Saniyede sayılan isteklerin zaman aralığı",
  238. "_cfg_threshold": "Korumanın etkinleşeceği sınır değeri",
  239. "_cfg_local_floodwait": (
  240. "Telegram API sınır değeri aşıldığında kullanıcı botu bir süre durdurulur"
  241. ),
  242. "_cfg_forbidden_methods": (
  243. "Belirtili metodların harici modüller tarafından çalıştırılmasını yasakla"
  244. ),
  245. "btn_no": "🚫 Hayır",
  246. "btn_yes": "✅ Evet",
  247. }
  248. strings_hi = {
  249. "warning": (
  250. "<emoji document_id=6319093650693293883>☣️</emoji>"
  251. " <b>चेतावनी!</b>\n\nइस खाते के लिए विन्यास में निर्दिष्ट सीमा सीमा"
  252. " पार कर गए हैं। टेलीग्राम एपीआई फ्लडिंग को रोकने के लिए, यह"
  253. " <b>सभी userbot</b> को {} सेकंड तक जमा कर दिया गया है। अधिक"
  254. " जानकारी के लिए नीचे दिए गए फ़ाइल पढ़ें।\n\nअपनी सहायता के लिए"
  255. " <code>{prefix}support</code> समूह का उपयोग करें!\n\nयदि आपको लगता है"
  256. " यह उपयोगकर्ता बॉट की योजित व्यवहार है, तो बस टाइमर समाप्त होने"
  257. " तक इंतजार करें और अगली बार एक ऐसी संसाधन ज्यादा खर्च करने वाली"
  258. " ऑपरेशन को योजित करने के लिए <code>{prefix}suspend_api_protect</code>"
  259. " &lt;सेकंड&gt; का उपयोग करें।"
  260. ),
  261. "args_invalid": (
  262. "<emoji document_id=6319093650693293883>☣️</emoji> <b>अमान्य तर्क</b>"
  263. ),
  264. "suspended_for": (
  265. "<emoji document_id=5458450833857322148>👌</emoji> <b>API Flood"
  266. " सुरक्षा को {} सेकंड के लिए अक्षम कर दिया गया है</b>"
  267. ),
  268. "test": (
  269. "<emoji document_id=6319093650693293883>☣️</emoji> <b>यह ऑपरेशन"
  270. " टेलीग्राम एपीआई को फ्लड करने की अनुमति देगा।</b> <i>आप क्या कर रहे हैं"
  271. " यह सुनिश्चित करने के लिए एक आसान परीक्षण को हल करें, जिसमें अलग"
  272. " एमोजी का पता लगाएं?</i>"
  273. ),
  274. "on": "<emoji document_id=5458450833857322148>👌</emoji> <b>सुरक्षा सक्षम</b>",
  275. "off": "<emoji document_id=5458450833857322148>👌</emoji> <b>सुरक्षा अक्षम</b>",
  276. "u_sure": (
  277. "<emoji document_id=6319093650693293883>☣️</emoji> <b>क्या आप"
  278. " सुनिश्चित हैं?</b>"
  279. ),
  280. "_cfg_time_sample": "प्रति सेकंड गिने जाने वाले अनुरोधों की समय सीमा",
  281. "_cfg_threshold": "सुरक्षा सक्षम करने के लिए मान सीमित करें",
  282. "_cfg_local_floodwait": (
  283. "यूजरबॉट को इस संख्या के सेकंड के लिए फ्रीज करें जब सीमा मान पार हो जाए"
  284. ),
  285. "_cfg_forbidden_methods": "सभी बाहरी मॉड्यूल में निषिद्ध तरीके",
  286. "btn_no": "🚫 नहीं",
  287. "btn_yes": "✅ हाँ",
  288. }
  289. strings_uz = {
  290. "warning": (
  291. "<emoji document_id=6319093650693293883>☣️</emoji>"
  292. " <b>Ogohlantirish!</b>\n\nBu hisob uchun konfiguratsiyada ko'rsatilgan"
  293. " chegaralar chegarani o'zgartirgan.\n\nTelegram API Flood"
  294. " to'xtatish uchun, bu <b>hammasi userbot</b> uchun {} sekundni"
  295. " blokirovka qilindi. Batafsil ma'lumot uchun pastdagi faylni o'qing.\n\n"
  296. "Yordam uchun <code>{prefix}support</code> guruhidan foydalaning!\n\nAgar"
  297. " siz hisobni botning yordamchisi bo'lishi kerak bo'lgan amalni bajarishga"
  298. " imkoniyat berishga o'xshaysiz, unda faqat blokirovkani to'xtatish uchun"
  299. " <code>{prefix}suspend_api_protect</code> &lt;sekund&gt; dan foydalaning."
  300. ),
  301. "args_invalid": (
  302. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Noto'g'ri"
  303. " argument</b>"
  304. ),
  305. "suspended_for": (
  306. "<emoji document_id=5458450833857322148>👌</emoji> <b>API Flood"
  307. " himoya {} sekund uchun to'xtatildi</b>"
  308. ),
  309. "test": (
  310. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Ushbu amal Telegram"
  311. " API-ni flood qilishga ruxsat beradi.</b> <i>Siz qanday ish"
  312. " bajarayotganingizni tekshirish uchun oson testni bajarishga harakat"
  313. " qiling, emojilarni aniqlash uchun?</i>"
  314. ),
  315. "on": "<emoji document_id=5458450833857322148>👌</emoji> <b>Himoya yoqildi</b>",
  316. "off": (
  317. "<emoji document_id=5458450833857322148>👌</emoji> <b>Himoya o'chirildi</b>"
  318. ),
  319. "u_sure": (
  320. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Siz"
  321. " ishonchingiz komilmi?</b>"
  322. ),
  323. "_cfg_time_sample": "Sekundda qabul qilinadigan so'rovlar soni chegarasi",
  324. "_cfg_threshold": "Himoya yoqish uchun qiymatni chegaralash",
  325. "_cfg_local_floodwait": (
  326. "Foydalanuvchi botni ushbu soniya davomida blokirovka qiladi, agar"
  327. " chegaralar qiymati oshsa"
  328. ),
  329. "_cfg_forbidden_methods": "Barcha tashqi modullarda taqiqlangan usullar",
  330. "btn_no": "🚫 Yo'q",
  331. "btn_yes": "✅ Ha",
  332. }
  333. strings_ja = {
  334. "warning": (
  335. "<emoji document_id=6319093650693293883>☣️</emoji>"
  336. " <b>警告!</b>\n\nこのアカウントの設定では、以下の制限が設定されています。\n\n"
  337. "Telegram APIのフラッドを防ぐために、この<b>すべてのユーザーボット</b>は"
  338. " {}秒間ブロックされます。詳細については、下記のファイルをご覧ください。\n\n"
  339. "サポートについては、<code>{prefix}support</code>グループをご利用ください!\n\n"
  340. "アカウントが実行する必要のあるアクションを許可する場合は、"
  341. "<code>{prefix}suspend_api_protect</code>を使用してブロックを解除するだけです。"
  342. ),
  343. "args_invalid": (
  344. "<emoji document_id=6319093650693293883>☣️</emoji> <b>無効な引数</b>"
  345. ),
  346. "suspended_for": (
  347. "<emoji document_id=5458450833857322148>👌</emoji>"
  348. " <b>APIフラッド保護が{}秒間無効になりました</b>"
  349. ),
  350. "test": (
  351. "<emoji document_id=6319093650693293883>☣️</emoji> <b>このアクションは、"
  352. "Telegram APIをフラッドさせることができます。</b> <i>あなたが何をしているかを"
  353. "確認するために、簡単なテストを実行するには、次のように入力してください。</i>"
  354. ),
  355. "on": "<emoji document_id=5458450833857322148>👌</emoji> <b>保護が有効になりました</b>",
  356. "off": "<emoji document_id=5458450833857322148>👌</emoji> <b>保護が無効になりました</b>",
  357. "u_sure": (
  358. "<emoji document_id=6319093650693293883>☣️</emoji> <b>本当によろしいですか?</b>"
  359. ),
  360. "_cfg_time_sample": "秒あたりの許可されたリクエスト数の制限",
  361. "_cfg_threshold": "制限を超えた場合の値",
  362. "_cfg_local_floodwait": "ユーザーがこの秒数以内にボットをブロックする場合",
  363. "_cfg_forbidden_methods": "すべての外部モジュールで禁止されているメソッド",
  364. "btn_no": "🚫 いいえ",
  365. "btn_yes": "✅ はい",
  366. }
  367. strings_kr = {
  368. "warning": (
  369. "<emoji document_id=6319093650693293883>☣️</emoji>"
  370. " <b>경고!</b>\n\n이 계정의 설정에 따르면, 다음 제한이 설정됩니다.\n\n"
  371. "이 <b>모든 사용자 봇</b>은 Telegram API의 플러드를 방지하기 위해"
  372. " {}초 동안 차단됩니다. 자세한 내용은 아래 파일을 참조하십시오.\n\n"
  373. "지원에 대해서는 <code>{prefix}support</code> 그룹을 사용하십시오!\n\n"
  374. "계정이 실행해야하는 작업을 허용하려면, <code>{prefix}suspend_api_protect</code>를"
  375. "사용하여 차단을 해제하십시오."
  376. ),
  377. "args_invalid": (
  378. "<emoji document_id=6319093650693293883>☣️</emoji> <b>잘못된인수</b>"
  379. ),
  380. "suspended_for": (
  381. "<emoji document_id=5458450833857322148>👌</emoji>"
  382. " <b>API 플러드 보호가 {}초간 비활성화되었습니다</b>"
  383. ),
  384. "test": (
  385. "<emoji document_id=6319093650693293883>☣️</emoji> <b>이 작업은"
  386. "Telegram API를 플러드시킬 수 있습니다.</b> <i>당신이 무엇을 하는지 확인하기 위해,"
  387. "간단한 테스트를 실행하려면 다음과 같이 입력하십시오.</i>"
  388. ),
  389. "on": "<emoji document_id=5458450833857322148>👌</emoji> <b>보호가 활성화되었습니다</b>",
  390. "off": "<emoji document_id=5458450833857322148>👌</emoji> <b>보호가 비활성화되었습니다</b>",
  391. "u_sure": "<emoji document_id=6319093650693293883>☣️</emoji> <b>확실합니까?</b>",
  392. "_cfg_time_sample": "허용되는 요청 수의 제한 초",
  393. "_cfg_threshold": "제한을 초과한 경우의 값",
  394. "_cfg_local_floodwait": "사용자가 이 초 이내에 봇을 차단하는 경우",
  395. "_cfg_forbidden_methods": "모든 외부 모듈에서 금지된 메서드",
  396. "btn_no": "🚫 아니요",
  397. "btn_yes": "✅ 예",
  398. }
  399. strings_ar = {
  400. "warning": (
  401. "<emoji document_id=6319093650693293883>☣️</emoji> <b>تحذير!</b>\n\nحسب"
  402. " إعدادات هذا الحساب، فإن الحدود التالية ستتم تطبيقها.\n\nسيتم حظر <b>جميع"
  403. " بوتات المستخدمين</b> لمدة {} ثانية لمنع تجاوز الحد الأقصى لمتطلبات"
  404. " Telegram API. لمزيد من المعلومات، راجع الملف التالي.\n\nللمساعدة، استخدم"
  405. " مجموعة <code>{prefix}support</code>!\n\nللسماح للحساب بالعمل، استخدم"
  406. " <code>{prefix}suspend_api_protect</code> لإلغاء الحظر."
  407. ),
  408. "args_invalid": (
  409. "<emoji document_id=6319093650693293883>☣️</emoji> <b>معلمات غير صالحة</b>"
  410. ),
  411. "suspended_for": (
  412. "<emoji document_id=5458450833857322148>👌</emoji>"
  413. " <b>تم تعطيل حماية API لمدة {} ثانية</b>"
  414. ),
  415. "test": (
  416. "<emoji document_id=6319093650693293883>☣️</emoji> <b>هذا الأمر قد يؤدي"
  417. " إلىتجاوز حدود Telegram API.</b> <i>للتحقق من ما تفعله، يمكنك تشغيل اختبار"
  418. " بسيطبالإضافة إلى الأمر التالي.</i>"
  419. ),
  420. "on": (
  421. "<emoji document_id=5458450833857322148>👌</emoji> <b>تم تفعيل الحماية</b>"
  422. ),
  423. "off": (
  424. "<emoji document_id=5458450833857322148>👌</emoji> <b>تم تعطيل الحماية</b>"
  425. ),
  426. "u_sure": (
  427. "<emoji document_id=6319093650693293883>☣️</emoji> <b>هل أنت متأكد؟</b>"
  428. ),
  429. "_cfg_time_sample": "المدة بالثواني التي يتم فيها تجاوزها حد المتطلبات",
  430. "_cfg_threshold": "قيمة تجاوزها الحد",
  431. "_cfg_local_floodwait": "المدة بالثواني التي يتم فيها حظر المستخدم للبوت",
  432. "_cfg_forbidden_methods": "الأوامر الممنوعة من قبل كل الإضافات الخارجية",
  433. "btn_no": "🚫 لا",
  434. "btn_yes": "✅ نعم",
  435. }
  436. strings_es = {
  437. "warning": (
  438. "<emoji document_id=6319093650693293883>☣️</emoji>"
  439. " <b>¡Advertencia!</b>\n\nDe acuerdo con la configuración de esta cuenta,"
  440. " las siguientes limitaciones serán aplicadas.\n\nSe bloqueará <b>a todos"
  441. " los bots de los usuarios</b> por {} segundos para evitar el exceso de las"
  442. " limitaciones de Telegram API. Para más información, consulta el archivo"
  443. " siguiente.\n\nPara obtener ayuda, use el grupo"
  444. " <code>{prefix}support</code>!\n\nPara permitir que la cuenta funcione,"
  445. " use <code>{prefix}suspend_api_protect</code> para desbloquear."
  446. ),
  447. "args_invalid": (
  448. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Argumentos"
  449. " inválidos</b>"
  450. ),
  451. "suspended_for": (
  452. "<emoji document_id=5458450833857322148>👌</emoji>"
  453. " <b>Se ha desactivado la protección de API por {} segundos</b>"
  454. ),
  455. "test": (
  456. "<emoji document_id=6319093650693293883>☣️</emoji> <b>Este comando puede"
  457. " llevar a exceder las limitaciones de Telegram API.</b> <i>Para comprobar"
  458. " que estás haciendo, puedes ejecutar una prueba simple agregando el"
  459. " siguiente comando.</i>"
  460. ),
  461. "on": (
  462. "<emoji document_id=5458450833857322148>👌</emoji> <b>Protección"
  463. " activada</b>"
  464. ),
  465. "off": (
  466. "<emoji document_id=5458450833857322148>👌</emoji> <b>Protección"
  467. " desactivada</b>"
  468. ),
  469. "u_sure": (
  470. "<emoji document_id=6319093650693293883>☣️</emoji> <b>¿Estás seguro?</b>"
  471. ),
  472. "_cfg_time_sample": (
  473. "El tiempo en segundos durante el cual se exceden las limitaciones"
  474. ),
  475. "_cfg_threshold": "El valor por encima del cual se exceden las limitaciones",
  476. "_cfg_local_floodwait": (
  477. "El tiempo en segundos durante el cual se bloquea al usuario para el bot"
  478. ),
  479. "_cfg_forbidden_methods": (
  480. "Los comandos prohibidos por todas las extensiones externas"
  481. ),
  482. "btn_no": "🚫 No",
  483. "btn_yes": "✅ Sí",
  484. }
  485. _ratelimiter = []
  486. _suspend_until = 0
  487. _lock = False
  488. def __init__(self):
  489. self.config = loader.ModuleConfig(
  490. loader.ConfigValue(
  491. "time_sample",
  492. 15,
  493. lambda: self.strings("_cfg_time_sample"),
  494. validator=loader.validators.Integer(minimum=1),
  495. ),
  496. loader.ConfigValue(
  497. "threshold",
  498. 100,
  499. lambda: self.strings("_cfg_threshold"),
  500. validator=loader.validators.Integer(minimum=10),
  501. ),
  502. loader.ConfigValue(
  503. "local_floodwait",
  504. 30,
  505. lambda: self.strings("_cfg_local_floodwait"),
  506. validator=loader.validators.Integer(minimum=10, maximum=3600),
  507. ),
  508. loader.ConfigValue(
  509. "forbidden_methods",
  510. ["joinChannel", "importChatInvite"],
  511. lambda: self.strings("_cfg_forbidden_methods"),
  512. validator=loader.validators.MultiChoice(
  513. [
  514. "sendReaction",
  515. "joinChannel",
  516. "importChatInvite",
  517. ]
  518. ),
  519. on_change=lambda: self._client.forbid_constructors(
  520. map(
  521. lambda x: CONSTRUCTORS[x], self.config["forbidden_constructors"]
  522. )
  523. ),
  524. ),
  525. )
  526. async def client_ready(self):
  527. asyncio.ensure_future(self._install_protection())
  528. async def _install_protection(self):
  529. await asyncio.sleep(30) # Restart lock
  530. if hasattr(self._client._call, "_old_call_rewritten"):
  531. raise loader.SelfUnload("Already installed")
  532. old_call = self._client._call
  533. async def new_call(
  534. sender: "MTProtoSender", # type: ignore
  535. request: "TLRequest", # type: ignore
  536. ordered: bool = False,
  537. flood_sleep_threshold: int = None,
  538. ):
  539. if time.perf_counter() > self._suspend_until and not self.get(
  540. "disable_protection",
  541. True,
  542. ):
  543. request_name = type(request).__name__
  544. self._ratelimiter += [[request_name, time.perf_counter()]]
  545. self._ratelimiter = list(
  546. filter(
  547. lambda x: time.perf_counter() - x[1]
  548. < int(self.config["time_sample"]),
  549. self._ratelimiter,
  550. )
  551. )
  552. if (
  553. len(self._ratelimiter) > int(self.config["threshold"])
  554. and not self._lock
  555. ):
  556. self._lock = True
  557. report = io.BytesIO(
  558. json.dumps(
  559. self._ratelimiter,
  560. indent=4,
  561. ).encode("utf-8")
  562. )
  563. report.name = "local_fw_report.json"
  564. await self.inline.bot.send_document(
  565. self.tg_id,
  566. report,
  567. caption=self.strings("warning").format(
  568. self.config["local_floodwait"],
  569. prefix=self.get_prefix(),
  570. ),
  571. )
  572. # It is intented to use time.sleep instead of asyncio.sleep
  573. time.sleep(int(self.config["local_floodwait"]))
  574. self._lock = False
  575. return await old_call(sender, request, ordered, flood_sleep_threshold)
  576. self._client._call = new_call
  577. self._client._old_call_rewritten = old_call
  578. self._client._call._hikka_overwritten = True
  579. logger.debug("Successfully installed ratelimiter")
  580. async def on_unload(self):
  581. if hasattr(self._client, "_old_call_rewritten"):
  582. self._client._call = self._client._old_call_rewritten
  583. delattr(self._client, "_old_call_rewritten")
  584. logger.debug("Successfully uninstalled ratelimiter")
  585. @loader.command(
  586. ru_doc="<время в секундах> - Заморозить защиту API на N секунд",
  587. de_doc="<Sekunden> - API-Schutz für N Sekunden einfrieren",
  588. tr_doc="<saniye> - API korumasını N saniye dondur",
  589. hi_doc="<सेकंड> - API सुरक्षा को N सेकंड जमा करें",
  590. uz_doc="<soniya> - API himoyasini N soniya o'zgartirish",
  591. )
  592. async def suspend_api_protect(self, message: Message):
  593. """<time in seconds> - Suspend API Ratelimiter for n seconds"""
  594. args = utils.get_args_raw(message)
  595. if not args or not args.isdigit():
  596. await utils.answer(message, self.strings("args_invalid"))
  597. return
  598. self._suspend_until = time.perf_counter() + int(args)
  599. await utils.answer(message, self.strings("suspended_for").format(args))
  600. @loader.command(
  601. ru_doc="Включить/выключить защиту API",
  602. de_doc="API-Schutz einschalten / ausschalten",
  603. tr_doc="API korumasını aç / kapat",
  604. hi_doc="API सुरक्षा चालू / बंद करें",
  605. uz_doc="API himoyasini yoqish / o'chirish",
  606. )
  607. async def api_fw_protection(self, message: Message):
  608. """Toggle API Ratelimiter"""
  609. await self.inline.form(
  610. message=message,
  611. text=self.strings("u_sure"),
  612. reply_markup=[
  613. {"text": self.strings("btn_no"), "action": "close"},
  614. {"text": self.strings("btn_yes"), "callback": self._finish},
  615. ],
  616. )
  617. async def _finish(self, call: InlineCall):
  618. state = self.get("disable_protection", True)
  619. self.set("disable_protection", not state)
  620. await call.edit(self.strings("on" if state else "off"))