test.py 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052
  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 inspect
  9. import logging
  10. import os
  11. import random
  12. import time
  13. from io import BytesIO
  14. import typing
  15. from telethon.tl.types import Message
  16. from .. import loader, main, utils
  17. from ..inline.types import InlineCall
  18. logger = logging.getLogger(__name__)
  19. DEBUG_MODS_DIR = os.path.join(utils.get_base_dir(), "debug_modules")
  20. if not os.path.isdir(DEBUG_MODS_DIR):
  21. os.mkdir(DEBUG_MODS_DIR, mode=0o755)
  22. for mod in os.scandir(DEBUG_MODS_DIR):
  23. os.remove(mod.path)
  24. @loader.tds
  25. class TestMod(loader.Module):
  26. """Perform operations based on userbot self-testing"""
  27. _memory = {}
  28. strings = {
  29. "name": "Tester",
  30. "set_loglevel": "🚫 <b>Please specify verbosity as an integer or string</b>",
  31. "no_logs": "ℹ️ <b>You don't have any logs at verbosity {}.</b>",
  32. "logs_filename": "hikka-logs.txt",
  33. "logs_caption": (
  34. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Hikka logs with"
  35. " verbosity </b><code>{}</code>\n\n<emoji"
  36. " document_id=5454390891466726015>👋</emoji> <b>Hikka version:"
  37. " {}.{}.{}</b>{}\n<emoji document_id=6321050180095313397>⏱</emoji>"
  38. " <b>Uptime: {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{}"
  39. " InlineLogs</b>"
  40. ),
  41. "suspend_invalid_time": (
  42. "<emoji document_id=5416024721705673488>💀</emoji> <b>Invalid time to"
  43. " suspend</b>"
  44. ),
  45. "suspended": (
  46. "<emoji document_id=5452023368054216810>🥶</emoji> <b>Bot suspended"
  47. " for</b> <code>{}</code> <b>seconds</b>"
  48. ),
  49. "results_ping": (
  50. "<emoji document_id=6321050180095313397>⏱</emoji> <b>Telegram ping:</b>"
  51. " <code>{}</code> <b>ms</b>\n<emoji"
  52. " document_id=5377371691078916778>😎</emoji> <b>Uptime: {}</b>"
  53. ),
  54. "ping_hint": (
  55. "<emoji document_id=5472146462362048818>💡</emoji> <i>Telegram ping mostly"
  56. " depends on Telegram servers latency and other external factors and has"
  57. " nothing to do with the parameters of server on which userbot is"
  58. " installed</i>"
  59. ),
  60. "confidential": (
  61. "⚠️ <b>Log level </b><code>{}</code><b> may reveal your confidential info,"
  62. " be careful</b>"
  63. ),
  64. "confidential_text": (
  65. "⚠️ <b>Log level </b><code>{0}</code><b> may reveal your confidential info,"
  66. " be careful</b>\n<b>Type </b><code>.logs {0} force_insecure</code><b> to"
  67. " ignore this warning</b>"
  68. ),
  69. "choose_loglevel": "💁‍♂️ <b>Choose log level</b>",
  70. "bad_module": "🚫 <b>Module not found</b>",
  71. "debugging_enabled": (
  72. "🧑‍💻 <b>Debugging mode enabled for module </b><code>{0}</code>\n<i>Go to"
  73. " directory named `debug_modules`, edit file named `{0}.py` and see changes"
  74. " in real time</i>"
  75. ),
  76. "debugging_disabled": "✅ <b>Debugging disabled</b>",
  77. "send_anyway": "📤 Send anyway",
  78. "cancel": "🚫 Cancel",
  79. }
  80. strings_ru = {
  81. "set_loglevel": "🚫 <b>Укажи уровень логов числом или строкой</b>",
  82. "no_logs": "ℹ️ <b>У тебя нет логов уровня {}.</b>",
  83. "logs_filename": "hikka-logs.txt",
  84. "logs_caption": (
  85. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Логи Hikka уровня"
  86. " </b><code>{}</code>\n\n<emoji document_id=5454390891466726015>👋</emoji>"
  87. " <b>Версия Hikka: {}.{}.{}</b>{}\n<emoji"
  88. " document_id=6321050180095313397>⏱</emoji> <b>Uptime:"
  89. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{}"
  90. " InlineLogs</b>"
  91. ),
  92. "bad_module": "🚫 <b>Модуль не найден</b>",
  93. "debugging_enabled": (
  94. "🧑‍💻 <b>Режим разработчика включен для модуля"
  95. " </b><code>{0}</code>\n<i>Отправляйся в директорию `debug_modules`,"
  96. " изменяй файл `{0}.py`, и смотри изменения в режиме реального времени</i>"
  97. ),
  98. "debugging_disabled": "✅ <b>Режим разработчика выключен</b>",
  99. "suspend_invalid_time": (
  100. "<emoji document_id=5416024721705673488>💀</emoji> <b>Неверное время"
  101. " заморозки</b>"
  102. ),
  103. "suspended": (
  104. "<emoji document_id=5452023368054216810>🥶</emoji> <b>Бот заморожен на</b>"
  105. " <code>{}</code> <b>секунд</b>"
  106. ),
  107. "results_ping": (
  108. "<emoji document_id=6321050180095313397>⏱</emoji> <b>Скорость отклика"
  109. " Telegram:</b> <code>{}</code> <b>ms</b>\n<emoji"
  110. " document_id=5377371691078916778>😎</emoji> <b>Прошло с последней"
  111. " перезагрузки: {}</b>"
  112. ),
  113. "ping_hint": (
  114. "<emoji document_id=5472146462362048818>💡</emoji> <i>Скорость отклика"
  115. " Telegram в большей степени зависит от загруженности серверов Telegram и"
  116. " других внешних факторов и никак не связана с параметрами сервера, на"
  117. " который установлен юзербот</i>"
  118. ),
  119. "confidential": (
  120. "⚠️ <b>Уровень логов </b><code>{}</code><b> может содержать личную"
  121. " информацию, будь осторожен</b>"
  122. ),
  123. "confidential_text": (
  124. "⚠️ <b>Уровень логов </b><code>{0}</code><b> может содержать личную"
  125. " информацию, будь осторожен</b>\n<b>Напиши </b><code>.logs {0}"
  126. " force_insecure</code><b>, чтобы отправить логи игнорируя"
  127. " предупреждение</b>"
  128. ),
  129. "choose_loglevel": "💁‍♂️ <b>Выбери уровень логов</b>",
  130. "_cmd_doc_dump": "Показать информацию о сообщении",
  131. "_cmd_doc_logs": (
  132. "<уровень> - Отправляет лог-файл. Уровни ниже WARNING могут содержать"
  133. " личную инфомрацию."
  134. ),
  135. "_cmd_doc_suspend": "<время> - Заморозить бота на некоторое время",
  136. "_cmd_doc_ping": "Проверяет скорость отклика юзербота",
  137. "_cls_doc": "Операции, связанные с самотестированием",
  138. "send_anyway": "📤 Все равно отправить",
  139. "cancel": "🚫 Отмена",
  140. }
  141. strings_de = {
  142. "set_loglevel": (
  143. "🚫 <b>Geben Sie die Protokollebene als Zahl oder Zeichenfolge an</b>"
  144. ),
  145. "no_logs": "ℹ️ <b>Du hast kein Protokollnachrichten des {} Ebene.</b>",
  146. "logs_filename": "hikka-logs.txt",
  147. "logs_caption": (
  148. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Hikka-Level-Protokolle"
  149. " </b><code>{}</code>\n\n<emoji document_id=5454390891466726015>👋</emoji>"
  150. " <b>Hikka-Version: {}.{}.{}</b>{}\n<Emoji"
  151. "document_id=6321050180095313397>⏱</emoji> <b>Verfügbarkeit:"
  152. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  153. "InlineLogs</b>"
  154. ),
  155. "bad_module": "🚫 <b>Modul nicht gefunden</b>",
  156. "debugging_enabled": (
  157. (
  158. "🧑‍💻 <b>Entwicklermodus für Modul aktiviert"
  159. " </b><code>{0}</code>\n<i>Gehe zum Verzeichnis `debug_modules`"
  160. ),
  161. (
  162. "Ändern Sie die `{0}.py`-Datei und sehen Sie sich die Änderungen in"
  163. " Echtzeit an</i>"
  164. ),
  165. ),
  166. "debugging_disabled": "✅ <b>Entwicklermodus deaktiviert</b>",
  167. "suspend_invalid_time": (
  168. "<emoji document_id=5416024721705673488>💀</emoji> <b>Falsche Zeit"
  169. "einfrieren</b>"
  170. ),
  171. "suspended": (
  172. "<emoji document_id=5452023368054216810>🥶</emoji> <b>Bot ist"
  173. " eingefroren</b> <code>{}</code> <b>Sekunden</b>"
  174. ),
  175. "results_ping": (
  176. "<emoji document_id=6321050180095313397>⏱</emoji> <b>Reaktionszeit des"
  177. " Telegram:</b> <code>{}</code> <b>ms</b>\n<emoji"
  178. " document_id=5377371691078916778>😎</emoji> <b>Zeit seit dem letzten"
  179. " Neustart: {}</b>"
  180. ),
  181. "ping_hint": (
  182. "<emoji document_id=5472146462362048818>💡</emoji>"
  183. " <i>ReaktionsfähigkeitTelegram ist stärker abhängig von der Auslastung der"
  184. " Telegram-Server undAndere externe Faktoren und steht in keinem"
  185. " Zusammenhang mit den Servereinstellungen welcher Userbot installiert"
  186. " ist</i>"
  187. ),
  188. "confidential": (
  189. "⚠️ <b>Protokollebene </b><code>{}</code><b> kann privat enthalten"
  190. "Informationen, seien Sie vorsichtig</b>"
  191. ),
  192. "confidential_text": (
  193. "⚠️ <b>Protokollebene </b><code>{0}</code><b> kann privat"
  194. " enthaltenInformationen, seien Sie vorsichtig</b>\n<b>Schreiben Sie"
  195. " </b><code>.logs {0} force_insecure</code><b> um Protokolle zu"
  196. " ignorierenWarnung</b>"
  197. ),
  198. "choose_loglevel": "💁‍♂️ <b>Wähle eine Protokollebene</b>",
  199. "_cmd_doc_dump": "Nachrichteninformationen anzeigen",
  200. "_cmd_doc_logs": (
  201. "<Ebene> - Sendet eine Protokolldatei. Ebenen unterhalb von WARNUNG können"
  202. " enthaltenpersönliche Informationen."
  203. ),
  204. "_cmd_doc_suspend": "<Zeit> - Bot für eine Weile einfrieren",
  205. "_cmd_doc_ping": "Überprüft die Antwortgeschwindigkeit des Userbots",
  206. "_cls_doc": "Selbsttestbezogene Operationen",
  207. "send_anyway": "📤 Trotzdem senden",
  208. "cancel": "🚫 Abbrechen",
  209. }
  210. strings_uz = {
  211. "set_loglevel": "🚫 <b>Log darajasini raqam yoki satr sifatida ko'rsating</b>",
  212. "no_logs": "ℹ️ <b>Siz {} darajadagi hech qanday loglaringiz yo'q.</b>",
  213. "logs_filename": "hikka-logs.txt",
  214. "logs_caption": (
  215. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Hikka Loglari"
  216. " </b><code>{}</code>\n\n<emoji document_id=5454390891466726015>👋</emoji>"
  217. " <b>Hikka-versiyasi: {}.{}.{}</b>{}\n<Emoji"
  218. "document_id=6321050180095313397>⏱</emoji> <b>Mavjudligi:"
  219. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  220. "InlineLogs</b>"
  221. ),
  222. "bad_module": "🚫 <b>Modul topilmadi</b>",
  223. "debugging_enabled": (
  224. (
  225. "🧑‍💻 <b>Modul uchun ishlab chiqarish rejimi yoqildi"
  226. " </b><code>{0}</code>\n<i>`debug_modules` papkasiga o'ting"
  227. ),
  228. "`{0}.py` faylini o'zgartiring va o'zgarishlarni reallaqam ko'ring</i>",
  229. ),
  230. "debugging_disabled": "✅ <b>Ishtirok rejimi o'chirildi</b>",
  231. "suspend_invalid_time": (
  232. "<emoji document_id=5416024721705673488>💀</emoji> <b>Noto'g'ri vaqt"
  233. "qo'ymoq</b>"
  234. ),
  235. "suspended": (
  236. "<emoji document_id=5452023368054216810>🥶</emoji> <b>Bot chiqarildi</b>"
  237. " <code>{}</code> <b>Soniyalar</b>"
  238. ),
  239. "results_ping": (
  240. "<emoji document_id=6321050180095313397>⏱</emoji> <b>Telegram tezligi:</b>"
  241. " <code>{}</code> <b>ms</b>\n<emoji"
  242. " document_id=5377371691078916778>😎</emoji> <b>Soʻngi marotaba qayta ishga"
  243. " tushirilgan vaqti:</b> {}"
  244. ),
  245. "ping_hint": (
  246. "<emoji document_id=5472146462362048818>💡</emoji> <i>Telegram"
  247. " tezligiTelegram serverlarining ishga tushishi va boshqa tashqi"
  248. " faktorlariga bog'liq va Userbot o'rnatilgan serverlarining sozlamalari"
  249. " bilan bog'liq emas</i>"
  250. ),
  251. "confidential": (
  252. "⚠️ <b>Log darajasi </b><code>{}</code><b> shaxsiy ma'lumotlarga ega"
  253. " bo'lishi mumkinO'zingizni xavfsizligi uchun</b>"
  254. ),
  255. "confidential_text": (
  256. "⚠️ <b>Log darajasi </b><code>{0}</code><b> shaxsiy ma'lumotlarga ega"
  257. " bo'lishi mumkinO'zingizni xavfsizligi uchun</b>\n<b>Yozing"
  258. " </b><code>.logs {0} force_insecure</code><b> loglarniOgohlantirish</b>"
  259. ),
  260. "choose_loglevel": "💁‍♂️ <b>Log darajasini tanlang</b>",
  261. "_cmd_doc_dump": "Xabar haqida ma'lumotlarni ko'rsatish",
  262. "_cmd_doc_logs": (
  263. "<Ebene> - Log faylini yuboradi. O'rin darajalari xavfsizlikma'lumotlar."
  264. ),
  265. "_cmd_doc_suspend": "<Vaqt> - Botni bir necha vaqtga o'chirish",
  266. "_cmd_doc_ping": "Userbotning javob berish tezligini tekshirish",
  267. "_cls_doc": "O'z testi bilan bog'liq operatsiyalar",
  268. "send_anyway": "📤 Baribir yuborish",
  269. "cancel": "🚫 Bekor qilish",
  270. }
  271. strings_tr = {
  272. "set_loglevel": (
  273. "🚫 <b>Lütfen günlük seviyesini sayı veya dize olarak belirtin</b>"
  274. ),
  275. "no_logs": "ℹ️ <b>Hiçbir {} seviyesindeki günlük bulunmuyor.</b>",
  276. "logs_filename": "hikka-logs.txt",
  277. "logs_caption": (
  278. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Hikka Günlükleri"
  279. " </b><code>{}</code>\n\n<emoji document_id=5454390891466726015>👋</emoji>"
  280. " <b>Hikka versiyası: {}.{}.{}</b>{}\n<Emoji"
  281. "document_id=6321050180095313397>⏱</emoji> <b>Süre:"
  282. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  283. "InlineLogs</b>"
  284. ),
  285. "bad_module": "🚫 <b>Modül bulunamadı</b>",
  286. "debugging_enabled": (
  287. (
  288. "🧑‍💻 <b>Geliştirme modu modül için etkinleştirildi"
  289. " </b><code>{0}</code>\n<i>`debug_modules` klasörüne gidin"
  290. ),
  291. (
  292. "`{0}.py` dosyasını düzenleyin ve değişiklikleri gerçekleştirmek için"
  293. " kaydedin</i>"
  294. ),
  295. ),
  296. "debugging_disabled": "✅ <b>Geliştirme modu devre dışı bırakıldı</b>",
  297. "suspend_invalid_time": (
  298. "<emoji document_id=5416024721705673488>💀</emoji> <b>Geçersiz zaman"
  299. "girdiniz</b>"
  300. ),
  301. "suspended": (
  302. "<emoji document_id=5452023368054216810>🥶</emoji> <b>Bot donduruldu</b>"
  303. " <code>{}</code> <b>saniye</b>"
  304. ),
  305. "results_ping": (
  306. "<emoji document_id=6321050180095313397>⏱</emoji> <b>Telegramhızı:</b>"
  307. " <code>{}</code> <b>ms</b>\n<emoji"
  308. " document_id=5377371691078916778>😎</emoji> <b>Son güncellemeden"
  309. " sonra:</b> {}"
  310. ),
  311. "ping_hint": (
  312. "<emoji document_id=5472146462362048818>💡</emoji> <i>Telegram hızı"
  313. "Telegram sunucularının başlatılması ve diğer dış faktörler ile alakalıdır"
  314. "ve Userbot kurulumunuzun sunucu ayarlarıyla alakalı değildir</i>"
  315. ),
  316. "confidential": (
  317. "⚠️ <b>Günlük seviyesi </b><code>{}</code><b> gizli bilgilere sahip"
  318. " olabilirKendi güvenliğiniz için</b>"
  319. ),
  320. "confidential_text": (
  321. "⚠️ <b>Günlük seviyesi </b><code>{0}</code><b> gizli bilgilere sahip"
  322. " olabilirKendi güvenliğiniz için</b>\n<b>Yazın </b><code>.logs {0}"
  323. " force_insecure</code><b> günlükleriuyarı</b>"
  324. ),
  325. "choose_loglevel": "💁‍♂️ <b>Lütfen günlük seviyesini seçin</b>",
  326. "_cmd_doc_dump": "Mesaj hakkında bilgi göster",
  327. "_cmd_doc_logs": (
  328. "<Ebene> - Günlük dosyasını gönderir. Seviyeler gizlibilgiler."
  329. ),
  330. "_cmd_doc_suspend": "<Zaman> - Botu bir süreliğine dondurun",
  331. "_cmd_doc_ping": "Userbotun yanıt verme hızını kontrol edin",
  332. "_cls_doc": "İlgili testlerle ilgili işlemler",
  333. "send_anyway": "📤 Gönder",
  334. "cancel": "🚫 İptal",
  335. }
  336. strings_hi = {
  337. "set_loglevel": (
  338. "🚫 <b>कृपया लॉग स्तर को संख्या या स्ट्रिंग के रूप में निर्दिष्ट करें</b>"
  339. ),
  340. "no_logs": "ℹ️ <b>कोई {} स्तर के लॉग नहीं मिला।</b>",
  341. "logs_filename": "hikka-logs.txt",
  342. "logs_caption": (
  343. "<emoji document_id=5188377234380954537>🌘</emoji> <b>Hikka लॉग</b>"
  344. " </code>\n\n<emoji document_id=5454390891466726015>👋</emoji>"
  345. " <b>Hikka संस्करण: {}.{}.{}</b>{}\n<Emoji"
  346. "document_id=6321050180095313397>⏱</emoji> <b>वेळ:"
  347. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  348. "InlineLogs</b>"
  349. ),
  350. "bad_module": "🚫 <b>मॉड्यूल नहीं मिला</b>",
  351. "debugging_enabled": (
  352. (
  353. "🧑‍💻 <b>मॉड्यूल के लिए डिबगिंग सक्षम कर दिया गया है"
  354. " </b><code>{0}</code>\n<i>`debug_modules` फ़ोल्डर में जाएँ"
  355. ),
  356. "`{0}.py` फ़ाइल को संपादित करें और परिवर्तनों को सहेजें</i>",
  357. ),
  358. "debugging_disabled": "✅ <b>डिबगिंग डिसेबल कर दिया गया है</b>",
  359. "suspend_invalid_time": (
  360. "<emoji document_id=5416024721705673488>💀</emoji> <b>अमान्य समय"
  361. "दर्ज किया गया।</b>"
  362. ),
  363. "suspended": (
  364. "<emoji document_id=5452023368054216810>🥶</emoji> <b>बॉट निलंबित कर दिया"
  365. " गया है</b> <code>{}</code> <b>सेकंड</b>"
  366. ),
  367. "results_ping": (
  368. "<emoji document_id=6321050180095313397>⏱</emoji> <b>टेलीग्राम"
  369. "गति:</b> <code>{}</code> <b>मिलीसेकंड</b>\n<emoji"
  370. " document_id=5377371691078916778>😎</emoji> <b>अंतिम अपडेट से बाद:</b> {}"
  371. ),
  372. "ping_hint": (
  373. "<emoji document_id=5472146462362048818>💡</emoji> <i>टेलीग्राम गति"
  374. "टेलीग्राम सर्वर को शुरू करने और अन्य बाहरी वजहों से जुड़ा है"
  375. "और आपके उपयोगकर्ता बॉट स्थापना के सर्वर सेटिंग्स से संबंधित नहीं है</i>"
  376. ),
  377. "confidential": (
  378. "<emoji document_id=6321050180095313397>⏱</emoji> <b>वेळ:"
  379. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  380. "InlineLogs</b>"
  381. ),
  382. "confidential_text": (
  383. "⚠️ <b>लॉग स्तर </b><code>{0}</code><b> में गोपनीय जानकारी हो सकती है"
  384. "अपनी सुरक्षा के लिए</b>\n<b>लिखें </b><code>.logs {0}"
  385. "force_insecure</code><b> लॉग"
  386. "चेतावनी</b>"
  387. ),
  388. "choose_loglevel": "💁‍♂️ <b>कृपया लॉग लेवल चुनें</b>",
  389. "_cmd_doc_dump": "संदेश के बारे में जानकारी दिखाएं",
  390. "_cmd_doc_logs": "<Ebene> - लॉग फ़ाइल भेजता है। स्तर छिपे हुए हैंसूचनाएं।",
  391. "_cmd_doc_suspend": "<समय> - बॉट को थोड़ी देर के लिए फ़्रीज़ करें",
  392. "_cmd_doc_ping": "यूजरबॉट रिस्पॉन्सिबिलिटी चेक करें",
  393. "_cls_doc": "संबंधित परीक्षण संसाधित किए जा रहे हैं",
  394. "send_anyway": "📤 फिर भी भेजें",
  395. "cancel": "🚫 रद्द करें",
  396. }
  397. strings_ja = {
  398. "debugging_enabled": "✅ <b>デバッグが有効になりました</b>",
  399. "debugging_disabled": "✅ <b>デバッグが無効になりました</b>",
  400. "suspend_invalid_time": (
  401. "<emoji document_id=5416024721705673488>💀</emoji> <b>無効な時間入力されました。</b>"
  402. ),
  403. "suspended": (
  404. "<emoji document_id=5452023368054216810>🥶</emoji> <b>ボットが"
  405. "一時停止されました</b> <code>{}</code> <b>秒</b>"
  406. ),
  407. "results_ping": (
  408. "<emoji document_id=6321050180095313397>⏱</emoji> <b>テレグラム"
  409. "速度:</b> <code>{}</code> <b>ミリ秒</b>\n<emoji"
  410. " document_id=5377371691078916778>😎</emoji> <b>最後の更新からの経過時間:</b> {}"
  411. ),
  412. "ping_hint": (
  413. "<emoji document_id=5472146462362048818>💡</emoji> <i>テレグラム速度"
  414. "テレグラムサーバーを起動し、他の外部要因により"
  415. "あなたのユーザーボットのセットアップとは関係がありません</i>"
  416. ),
  417. "confidential": (
  418. "<emoji document_id=6321050180095313397>⏱</emoji> <b>時間:"
  419. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  420. "InlineLogs</b>"
  421. ),
  422. "confidential_text": (
  423. "⚠️ <b>ログレベル </b><code>{0}</code><b>には機密情報が含まれている可能性があります"
  424. "セキュリティ上の理由で</b>\n<b>書き込み</b><code>.logs {0}"
  425. "force_insecure</code><b>ログ"
  426. "警告</b>"
  427. ),
  428. "choose_loglevel": "💁‍♂️ <b>ログレベルを選択してください</b>",
  429. "_cmd_doc_dump": "メッセージに関する情報を表示します",
  430. "_cmd_doc_logs": "<レベル> - ログファイルを送信します。隠されたレベルは通知されません。",
  431. "_cmd_doc_suspend": "<時間> - ボットを一時停止します",
  432. "_cmd_doc_ping": "ユーザーボットのレスポンス能力をチェックします",
  433. "_cls_doc": "関連するテストが実行されています",
  434. "send_anyway": "📤 それでも送信する",
  435. "cancel": "🚫 キャンセル",
  436. }
  437. strings_kr = {
  438. "debugging_enabled": "✅ <b>디버깅이 활성화되었습니다</b>",
  439. "debugging_disabled": "✅ <b>디버깅이 비활성화되었습니다</b>",
  440. "suspend_invalid_time": (
  441. "<emoji document_id=5416024721705673488>💀</emoji> <b>잘못된 시간입력되었습니다</b>"
  442. ),
  443. "suspended": (
  444. "<emoji document_id=5452023368054216810>🥶</emoji> <b>봇이"
  445. "일시 중지되었습니다</b> <code>{}</code> <b>초</b>"
  446. ),
  447. "results_ping": (
  448. "<emoji document_id=6321050180095313397>⏱</emoji> <b>텔레그램"
  449. "속도:</b> <code>{}</code> <b>밀리 초</b>\n<emoji"
  450. " document_id=5377371691078916778>😎</emoji> <b>마지막 업데이트 이후 경과 시간:</b> {}"
  451. ),
  452. "ping_hint": (
  453. "<emoji document_id=5472146462362048818>💡</emoji> <i>텔레그램 속도"
  454. "텔레그램 서버를 시작하고 다른 외부 요인에 의해"
  455. "당신의 사용자 봇의 설정과는 관련이 없습니다</i>"
  456. ),
  457. "confidential": (
  458. "<emoji document_id=6321050180095313397>⏱</emoji> <b>시간:"
  459. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  460. "InlineLogs</b>"
  461. ),
  462. "confidential_text": (
  463. "⚠️ <b>로그 레벨 </b><code>{0}</code><b>에는 기밀 정보가 포함될 수 있으므로"
  464. "보안상의 이유로</b>\n<b>작성</b><code>.logs {0}"
  465. "force_insecure</code><b>로그"
  466. "경고</b>"
  467. ),
  468. "choose_loglevel": "💁‍♂️ <b>로그 레벨을 선택하세요</b>",
  469. "_cmd_doc_dump": "메시지에 대한 정보를 표시합니다",
  470. "_cmd_doc_logs": "<레벨> - 로그 파일을 보냅니다. 숨겨진 레벨은 알림되지 않습니다.",
  471. "_cmd_doc_suspend": "<시간> - 봇을 일시 중지합니다",
  472. "_cmd_doc_ping": "사용자 봇의 응답 능력을 확인합니다",
  473. "_cls_doc": "관련된 테스트가 실행 중입니다",
  474. "send_anyway": "📤 그래도 보내기",
  475. "cancel": "🚫 취소",
  476. }
  477. strings_ar = {
  478. "debugging_enabled": "✅ <b>تم تمكين التصحيح</b>",
  479. "debugging_disabled": "✅ <b>تم تعطيل التصحيح</b>",
  480. "suspend_invalid_time": (
  481. "<emoji document_id=5416024721705673488>💀</emoji> <b>أدخلالوقت الصحيح</b>"
  482. ),
  483. "suspended": (
  484. "<emoji document_id=5452023368054216810>🥶</emoji> <b>تم إيقاف"
  485. "البوت</b> <code>{}</code> <b>ثوانٍ</b>"
  486. ),
  487. "results_ping": (
  488. "<emoji document_id=6321050180095313397>⏱</emoji> <b>سرعةتيليجرام:</b>"
  489. " <code>{}</code> <b>مللي ثانية</b>\n<emoji"
  490. " document_id=5377371691078916778>😎</emoji> <b>مدة الوقت منذ آخر"
  491. " تحديث:</b> {}"
  492. ),
  493. "ping_hint": (
  494. "<emoji document_id=5472146462362048818>💡</emoji> <i>سرعة"
  495. "تيليجرام ليست عبارة عن الوقت الذي يستغرقه البوت للرد على الرسائل"
  496. "لكنها هي الوقت الذي يستغرقه البوت للرد على الرسائل الخاصة بك من"
  497. "بدء تشغيل البوت وليس بسبب أي عوامل خارجية أخرى"
  498. "مثل إعدادات البوت الخاص بك</i>"
  499. ),
  500. "confidential": (
  501. "<emoji document_id=6321050180095313397>⏱</emoji> <b>الوقت:"
  502. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  503. "InlineLogs</b>"
  504. ),
  505. "confidential_text": (
  506. "⚠️ <b>يحتوي مستوى السجلات </b><code>{0}</code><b>على معلومات"
  507. "سرية ولذلك</b>\n<b>اكتب</b><code>.logs {0}"
  508. "force_insecure</code><b>لإرسال السجلات"
  509. "معلومات سرية</b>"
  510. ),
  511. "choose_loglevel": "💁‍♂️ <b>اختر مستوى السجلات</b>",
  512. "_cmd_doc_dump": "عرض معلومات الرسالة",
  513. "_cmd_doc_logs": (
  514. "<مستوى> - إرسال ملفات السجلات. المستويات المخفية لا يتم إخطارك عنها."
  515. ),
  516. "_cmd_doc_suspend": "<وقت> - إيقاف البوت مؤقتًا",
  517. "_cmd_doc_ping": "تحقق من سرعة البوت",
  518. "_cls_doc": "تم تشغيل اختبارات ذات صلة",
  519. "send_anyway": "📤 إرسالها على أية حال",
  520. "cancel": "🚫 إلغاء",
  521. }
  522. strings_es = {
  523. "debugging_enabled": "✅ <b>Depuración habilitada</b>",
  524. "debugging_disabled": "✅ <b>Depuración deshabilitada</b>",
  525. "suspend_invalid_time": (
  526. "<emoji document_id=5416024721705673488>💀</emoji> <b>Ingrese"
  527. "el tiempo correcto</b>"
  528. ),
  529. "suspended": (
  530. "<emoji document_id=5452023368054216810>🥶</emoji> <b>Bot"
  531. "suspendido</b> <code>{}</code> <b>segundos</b>"
  532. ),
  533. "results_ping": (
  534. "<emoji document_id=6321050180095313397>⏱</emoji> <b>Velocidad"
  535. "de Telegram:</b> <code>{}</code> <b>milisegundos</b>\n<emoji"
  536. " document_id=5377371691078916778>😎</emoji> <b>Desde el último"
  537. "actualización:</b> {}"
  538. ),
  539. "ping_hint": (
  540. "<emoji document_id=5472146462362048818>💡</emoji> <i>La velocidad"
  541. "de Telegram no es el tiempo que toma en responder el bot a los mensajes"
  542. "pero es el tiempo que toma en responder a tus mensajes desde que"
  543. "el bot se inició y no por cualquier otra razón externa"
  544. "como la configuración de tu bot</i>"
  545. ),
  546. "confidential": (
  547. "<emoji document_id=6321050180095313397>⏱</emoji> <b>Tiempo:"
  548. " {}</b>\n<b>{}</b>\n\n<b>{} NoNick</b>\n<b>{} Grep</b>\n<b>{ }"
  549. "InlineLogs</b>"
  550. ),
  551. "confidential_text": (
  552. "⚠️ <b>El nivel de registro </b><code>{0}</code><b>contiene"
  553. "información confidencial y por lo tanto</b>\n<b>escribe</b><code>.logs {0}"
  554. "force_insecure</code><b>para enviar los registros"
  555. "información confidencial</b>"
  556. ),
  557. "choose_loglevel": "💁‍♂️ <b>Elige el nivel de registro</b>",
  558. "_cmd_doc_dump": "Mostrar información del mensaje",
  559. "_cmd_doc_logs": (
  560. "<nivel> - Envía archivos de registro. Los niveles ocultos no se"
  561. " notificarán."
  562. ),
  563. "_cmd_doc_suspend": "<tiempo> - Suspende el bot temporalmente",
  564. "_cmd_doc_ping": "Verifique la velocidad del bot",
  565. "_cls_doc": "Se ejecutaron pruebas relacionadas",
  566. "send_anyway": "📤 Enviar de todos modos",
  567. "cancel": "🚫 Cancelar",
  568. }
  569. def __init__(self):
  570. self.config = loader.ModuleConfig(
  571. loader.ConfigValue(
  572. "force_send_all",
  573. False,
  574. "⚠️ Do not touch, if you don't know what it does!\nBy default, Hikka"
  575. " will try to determine, which client caused logs. E.g. there is a"
  576. " module TestModule installed on Client1 and TestModule2 on Client2. By"
  577. " default, Client2 will get logs from TestModule2, and Client1 will get"
  578. " logs from TestModule. If this option is enabled, Hikka will send all"
  579. " logs to Client1 and Client2, even if it is not the one that caused"
  580. " the log.",
  581. validator=loader.validators.Boolean(),
  582. on_change=self._pass_config_to_logger,
  583. ),
  584. loader.ConfigValue(
  585. "tglog_level",
  586. "INFO",
  587. "⚠️ Do not touch, if you don't know what it does!\n"
  588. "Minimal loglevel for records to be sent in Telegram.",
  589. validator=loader.validators.Choice(
  590. ["INFO", "WARNING", "ERROR", "CRITICAL"]
  591. ),
  592. on_change=self._pass_config_to_logger,
  593. ),
  594. )
  595. def _pass_config_to_logger(self):
  596. logging.getLogger().handlers[0].force_send_all = self.config["force_send_all"]
  597. logging.getLogger().handlers[0].tg_level = {
  598. "INFO": 20,
  599. "WARNING": 30,
  600. "ERROR": 40,
  601. "CRITICAL": 50,
  602. }[self.config["tglog_level"]]
  603. @loader.command(
  604. ru_doc="Ответь на сообщение, чтобы показать его дамп",
  605. de_doc="Antworten Sie auf eine Nachricht, um ihren Dump anzuzeigen",
  606. tr_doc="Dökümünü göstermek için bir iletiyi yanıtlayın",
  607. hi_doc="किसी संदेश का उत्तर उसके डंप को दिखाने के लिए दें",
  608. uz_doc="Xabarning axlatini ko'rsatish uchun unga javob bering",
  609. ja_doc="メッセージに返信してそのダンプを表示します",
  610. kr_doc="메시지에 답장하여 그 덤프를 표시합니다",
  611. ar_doc="أرسل رسالة لعرض نسخة منها",
  612. es_doc="Responde a un mensaje para mostrar su volcado",
  613. )
  614. async def dump(self, message: Message):
  615. """Use in reply to get a dump of a message"""
  616. if not message.is_reply:
  617. return
  618. await utils.answer(
  619. message,
  620. "<code>"
  621. + utils.escape_html((await message.get_reply_message()).stringify())
  622. + "</code>",
  623. )
  624. @loader.loop(interval=1)
  625. async def watchdog(self):
  626. if not os.path.isdir(DEBUG_MODS_DIR):
  627. return
  628. try:
  629. for module in os.scandir(DEBUG_MODS_DIR):
  630. last_modified = os.stat(module.path).st_mtime
  631. cls_ = module.path.split("/")[-1].split(".py")[0]
  632. if cls_ not in self._memory:
  633. self._memory[cls_] = last_modified
  634. continue
  635. if self._memory[cls_] == last_modified:
  636. continue
  637. self._memory[cls_] = last_modified
  638. logger.debug("Reloading debug module %s", cls_)
  639. with open(module.path, "r") as f:
  640. try:
  641. await next(
  642. module
  643. for module in self.allmodules.modules
  644. if module.__class__.__name__ == "LoaderMod"
  645. ).load_module(
  646. f.read(),
  647. None,
  648. save_fs=False,
  649. )
  650. except Exception:
  651. logger.exception("Failed to reload module in watchdog")
  652. except Exception:
  653. logger.exception("Failed debugging watchdog")
  654. return
  655. @loader.command(
  656. ru_doc=(
  657. "[модуль] - Для разработчиков: открыть модуль в режиме дебага и применять"
  658. " изменения из него в режиме реального времени"
  659. ),
  660. de_doc=(
  661. "[Modul] - Für Entwickler: Öffnet ein Modul im Debug-Modus und"
  662. " wendet Änderungen aus ihm in Echtzeit an"
  663. ),
  664. uz_doc=(
  665. "[modul] - Dasturchaklar uchun: modulni debug rejimida ochib, va uni"
  666. " real vaqtda ishga tushirish"
  667. ),
  668. tr_doc=(
  669. "[modul] - Geliştiriciler için: Bir modülü debug modunda açar ve"
  670. " değişiklikleri gerçek zamanlı uygular"
  671. ),
  672. hi_doc=(
  673. "[मॉड्यूल] - डेवलपर्स के लिए: एक मॉड्यूल को डिबग मोड में खोलें और"
  674. " वास्तविक समय में इसके परिवर्तनों को लागू करें"
  675. ),
  676. ja_doc="[モジュール] - 開発者向け:モジュールをデバッグモードで開き、変更をリアルタイムで適用します",
  677. kr_doc="[모듈] - 개발자용: 모듈을 디버그 모드로 열고 실시간으로 변경을 적용합니다",
  678. ar_doc=(
  679. "[وحدة] - للمطورين: فتح وحدة في وضع تصحيح الأخطاء وتطبيق"
  680. " التغييرات منه في الوقت الحقيقي"
  681. ),
  682. es_doc=(
  683. "[módulo] - Para desarrolladores: abre un módulo en modo de depuración y"
  684. " aplica los cambios de él en tiempo real"
  685. ),
  686. )
  687. async def debugmod(self, message: Message):
  688. """[module] - For developers: Open module for debugging
  689. You will be able to track changes in real-time"""
  690. args = utils.get_args_raw(message)
  691. instance = None
  692. for module in self.allmodules.modules:
  693. if (
  694. module.__class__.__name__.lower() == args.lower()
  695. or module.strings["name"].lower() == args.lower()
  696. ):
  697. if os.path.isfile(
  698. os.path.join(
  699. DEBUG_MODS_DIR,
  700. f"{module.__class__.__name__}.py",
  701. )
  702. ):
  703. os.remove(
  704. os.path.join(
  705. DEBUG_MODS_DIR,
  706. f"{module.__class__.__name__}.py",
  707. )
  708. )
  709. try:
  710. delattr(module, "hikka_debug")
  711. except AttributeError:
  712. pass
  713. await utils.answer(message, self.strings("debugging_disabled"))
  714. return
  715. module.hikka_debug = True
  716. instance = module
  717. break
  718. if not instance:
  719. await utils.answer(message, self.strings("bad_module"))
  720. return
  721. with open(
  722. os.path.join(
  723. DEBUG_MODS_DIR,
  724. f"{instance.__class__.__name__}.py",
  725. ),
  726. "wb",
  727. ) as f:
  728. f.write(inspect.getmodule(instance).__loader__.data)
  729. await utils.answer(
  730. message,
  731. self.strings("debugging_enabled").format(instance.__class__.__name__),
  732. )
  733. @loader.command(
  734. ru_doc="<уровень> - Показать логи",
  735. de_doc="<Level> - Zeige Logs",
  736. uz_doc="<daraja> - Loglarni ko'rsatish",
  737. tr_doc="<seviye> - Günlükleri göster",
  738. hi_doc="<स्तर> - लॉग दिखाएं",
  739. ja_doc="<レベル> - ログを表示します",
  740. kr_doc="<레벨> - 로그 표시",
  741. ar_doc="<مستوى> - إظهار السجلات",
  742. es_doc="<nivel> - Mostrar registros",
  743. )
  744. async def logs(
  745. self,
  746. message: typing.Union[Message, InlineCall],
  747. force: bool = False,
  748. lvl: typing.Union[int, None] = None,
  749. ):
  750. """<level> - Dump logs"""
  751. if not isinstance(lvl, int):
  752. args = utils.get_args_raw(message)
  753. try:
  754. try:
  755. lvl = int(args.split()[0])
  756. except ValueError:
  757. lvl = getattr(logging, args.split()[0].upper(), None)
  758. except IndexError:
  759. lvl = None
  760. if not isinstance(lvl, int):
  761. try:
  762. if not self.inline.init_complete or not await self.inline.form(
  763. text=self.strings("choose_loglevel"),
  764. reply_markup=[
  765. [
  766. {
  767. "text": "🚨 Critical",
  768. "callback": self.logs,
  769. "args": (False, 50),
  770. },
  771. {
  772. "text": "🚫 Error",
  773. "callback": self.logs,
  774. "args": (False, 40),
  775. },
  776. ],
  777. [
  778. {
  779. "text": "⚠️ Warning",
  780. "callback": self.logs,
  781. "args": (False, 30),
  782. },
  783. {
  784. "text": "ℹ️ Info",
  785. "callback": self.logs,
  786. "args": (False, 20),
  787. },
  788. ],
  789. [
  790. {
  791. "text": "🧑‍💻 Debug",
  792. "callback": self.logs,
  793. "args": (False, 10),
  794. },
  795. {
  796. "text": "👁 All",
  797. "callback": self.logs,
  798. "args": (False, 0),
  799. },
  800. ],
  801. [{"text": "🚫 Cancel", "action": "close"}],
  802. ],
  803. message=message,
  804. ):
  805. raise
  806. except Exception:
  807. await utils.answer(message, self.strings("set_loglevel"))
  808. return
  809. logs = "\n\n".join(
  810. [
  811. "\n".join(
  812. handler.dumps(lvl, client_id=self._client.tg_id)
  813. if "client_id" in inspect.signature(handler.dumps).parameters
  814. else handler.dumps(lvl)
  815. )
  816. for handler in logging.getLogger().handlers
  817. ]
  818. )
  819. named_lvl = (
  820. lvl
  821. if lvl not in logging._levelToName
  822. else logging._levelToName[lvl] # skipcq: PYL-W0212
  823. )
  824. if (
  825. lvl < logging.WARNING
  826. and not force
  827. and (
  828. not isinstance(message, Message)
  829. or "force_insecure" not in message.raw_text.lower()
  830. )
  831. ):
  832. try:
  833. if not self.inline.init_complete:
  834. raise
  835. cfg = {
  836. "text": self.strings("confidential").format(named_lvl),
  837. "reply_markup": [
  838. {
  839. "text": self.strings("send_anyway"),
  840. "callback": self.logs,
  841. "args": [True, lvl],
  842. },
  843. {"text": self.strings("cancel"), "action": "close"},
  844. ],
  845. }
  846. if isinstance(message, Message):
  847. if not await self.inline.form(**cfg, message=message):
  848. raise
  849. else:
  850. await message.edit(**cfg)
  851. except Exception:
  852. await utils.answer(
  853. message,
  854. self.strings("confidential_text").format(named_lvl),
  855. )
  856. return
  857. if len(logs) <= 2:
  858. if isinstance(message, Message):
  859. await utils.answer(message, self.strings("no_logs").format(named_lvl))
  860. else:
  861. await message.edit(self.strings("no_logs").format(named_lvl))
  862. await message.unload()
  863. return
  864. if btoken := self._db.get("hikka.inline", "bot_token", False):
  865. logs = logs.replace(
  866. btoken,
  867. f'{btoken.split(":")[0]}:***************************',
  868. )
  869. if hikka_token := self._db.get("HikkaDL", "token", False):
  870. logs = logs.replace(
  871. hikka_token,
  872. f'{hikka_token.split("_")[0]}_********************************',
  873. )
  874. if hikka_token := self._db.get("Kirito", "token", False):
  875. logs = logs.replace(
  876. hikka_token,
  877. f'{hikka_token.split("_")[0]}_********************************',
  878. )
  879. if os.environ.get("DATABASE_URL"):
  880. logs = logs.replace(
  881. os.environ.get("DATABASE_URL"),
  882. "postgre://**************************",
  883. )
  884. if os.environ.get("REDIS_URL"):
  885. logs = logs.replace(
  886. os.environ.get("REDIS_URL"),
  887. "postgre://**************************",
  888. )
  889. if os.environ.get("hikka_session"):
  890. logs = logs.replace(
  891. os.environ.get("hikka_session"),
  892. "StringSession(**************************)",
  893. )
  894. logs = BytesIO(logs.encode("utf-16"))
  895. logs.name = self.strings("logs_filename")
  896. ghash = utils.get_git_hash()
  897. other = (
  898. *main.__version__,
  899. " <i><a"
  900. f' href="https://github.com/hikariatama/Hikka/commit/{ghash}">({ghash[:8]})</a></i>'
  901. if ghash
  902. else "",
  903. utils.formatted_uptime(),
  904. utils.get_named_platform(),
  905. "✅" if self._db.get(main.__name__, "no_nickname", False) else "🚫",
  906. "✅" if self._db.get(main.__name__, "grep", False) else "🚫",
  907. "✅" if self._db.get(main.__name__, "inlinelogs", False) else "🚫",
  908. )
  909. if getattr(message, "out", True):
  910. await message.delete()
  911. if isinstance(message, Message):
  912. await utils.answer(
  913. message,
  914. logs,
  915. caption=self.strings("logs_caption").format(named_lvl, *other),
  916. )
  917. else:
  918. await self._client.send_file(
  919. message.form["chat"],
  920. logs,
  921. caption=self.strings("logs_caption").format(named_lvl, *other),
  922. )
  923. @loader.owner
  924. @loader.command(
  925. ru_doc="<время> - Заморозить бота на N секунд",
  926. de_doc="<Zeit> - Stoppe den Bot für N Sekunden",
  927. tr_doc="<süre> - Botu N saniye boyunca durdur",
  928. uz_doc="<vaqt> - Botni N soniya davomida to'xtatish",
  929. hi_doc="<समय> - बॉट को N सेकंड तक ठहराएं",
  930. ja_doc="<時間> - ボットをN秒間停止します",
  931. kr_doc="<시간> - 봇을 N 초 동안 정지",
  932. ar_doc="<الوقت> - تجميد البوت لمدة N ثانية",
  933. es_doc="<tiempo> - Congela el bot durante N segundos",
  934. )
  935. async def suspend(self, message: Message):
  936. """<time> - Suspends the bot for N seconds"""
  937. try:
  938. time_sleep = float(utils.get_args_raw(message))
  939. await utils.answer(
  940. message,
  941. self.strings("suspended").format(time_sleep),
  942. )
  943. time.sleep(time_sleep)
  944. except ValueError:
  945. await utils.answer(message, self.strings("suspend_invalid_time"))
  946. @loader.command(
  947. ru_doc="Проверить скорость отклика юзербота",
  948. de_doc="Überprüfe die Antwortgeschwindigkeit des Userbots",
  949. tr_doc="Kullanıcı botunun yanıt hızını kontrol edin",
  950. uz_doc="Foydalanuvchi botining javob tezligini tekshiring",
  951. hi_doc="उपयोगकर्ता बॉट की प्रतिक्रिया गति की जांच करें",
  952. ja_doc="ユーザーボットの応答速度を確認します",
  953. kr_doc="사용자 봇의 응답 속도를 확인하십시오",
  954. ar_doc="تحقق من سرعة استجابة بوت المستخدم",
  955. es_doc="Comprueba la velocidad de respuesta del bot de usuario",
  956. )
  957. async def ping(self, message: Message):
  958. """Test your userbot ping"""
  959. start = time.perf_counter_ns()
  960. message = await utils.answer(message, "<code>🐻 Nofin...</code>")
  961. await utils.answer(
  962. message,
  963. self.strings("results_ping").format(
  964. round((time.perf_counter_ns() - start) / 10**6, 3),
  965. utils.formatted_uptime(),
  966. )
  967. + (
  968. ("\n\n" + self.strings("ping_hint"))
  969. if random.choice([0, 0, 1]) == 1
  970. else ""
  971. ),
  972. )
  973. async def client_ready(self):
  974. chat, _ = await utils.asset_channel(
  975. self._client,
  976. "hikka-logs",
  977. "🌘 Your Hikka logs will appear in this chat",
  978. silent=True,
  979. invite_bot=True,
  980. avatar="https://github.com/hikariatama/assets/raw/master/hikka-logs.png",
  981. )
  982. self._logchat = int(f"-100{chat.id}")
  983. self.watchdog.start()
  984. logging.getLogger().handlers[0].install_tg_log(self)
  985. logger.debug("Bot logging installed for %s", self._logchat)
  986. self._pass_config_to_logger()