sudoers.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import re
  2. import time
  3. from pyrogram import filters, types
  4. import speedtest
  5. import psutil
  6. from wbb import app, SUDOERS, bot_start_time
  7. from wbb.utils import nekobin, formatter
  8. from wbb.utils.errors import capture_err
  9. from wbb.utils.botinfo import BOT_ID
  10. from wbb.utils.dbfunctions import (
  11. is_gbanned_user,
  12. add_gban_user,
  13. remove_gban_user,
  14. get_served_chats
  15. )
  16. __MODULE__ = "Sudoers"
  17. __HELP__ = '''/log - To Get Logs From Last Run.
  18. /speedtest - To Perform A Speedtest.
  19. /stats - To Check System Status.
  20. /global_stats - To Check Bot's Global Stats.
  21. /gban - To Ban A User Globally.
  22. /broadcast - To Broadcast A Message In All Groups.'''
  23. # Logs Module
  24. @app.on_message(filters.user(SUDOERS) & filters.command("log"))
  25. @capture_err
  26. async def logs_chat(_, message):
  27. keyb = types.InlineKeyboardMarkup(
  28. [
  29. [
  30. types.InlineKeyboardButton(
  31. "Paste on Nekobin", callback_data="paste_log_nekobin"
  32. )
  33. ]
  34. ]
  35. )
  36. await message.reply_document(
  37. "error.log", reply_markup=keyb
  38. )
  39. def logs_callback(_, __, query):
  40. if re.match("paste_log_nekobin", query.data):
  41. return True
  42. logs_create = filters.create(logs_callback)
  43. @app.on_callback_query(logs_create)
  44. async def paste_log_neko(client, query):
  45. if query.from_user.id in SUDOERS:
  46. j = open("error.log", "r")
  47. data = await nekobin.neko(j.read())
  48. keyb = types.InlineKeyboardMarkup(
  49. [[types.InlineKeyboardButton("Pasted!", url=f"{data}")]]
  50. )
  51. await query.message.edit_caption("Successfully Nekofied",
  52. reply_markup=keyb)
  53. else:
  54. await client.answer_callback_query(
  55. query.id, "'Blue Button Must Press', huh?", show_alert=True
  56. )
  57. # SpeedTest Module
  58. def speed_convert(size):
  59. power = 2 ** 10
  60. zero = 0
  61. units = {0: "", 1: "Kb/s", 2: "Mb/s", 3: "Gb/s", 4: "Tb/s"}
  62. while size > power:
  63. size /= power
  64. zero += 1
  65. return f"{round(size, 2)} {units[zero]}"
  66. @app.on_message(
  67. filters.user(SUDOERS) & filters.command("speedtest")
  68. )
  69. @capture_err
  70. async def get_speedtest_result(_, message):
  71. m = await message.reply_text("`Performing A Speedtest!`")
  72. speed = speedtest.Speedtest()
  73. i = speed.get_best_server()
  74. j = speed.download()
  75. k = speed.upload()
  76. await m.edit(f'''
  77. **Download:** {speed_convert(j)}
  78. **Upload:** {speed_convert(k)}
  79. **Latency:** {round((i["latency"]))} ms
  80. ```''')
  81. # Stats Module
  82. async def bot_sys_stats():
  83. bot_uptime = int(time.time() - bot_start_time)
  84. cpu = psutil.cpu_percent(interval=0.5)
  85. mem = psutil.virtual_memory().percent
  86. disk = psutil.disk_usage("/").percent
  87. stats = f'''
  88. Uptime: {formatter.get_readable_time((bot_uptime))}
  89. CPU: {cpu}%
  90. RAM: {mem}%
  91. Disk: {disk}%'''
  92. return stats
  93. @app.on_message(
  94. filters.user(SUDOERS) & filters.command("stats")
  95. )
  96. @capture_err
  97. async def get_stats(_, message):
  98. stats = await bot_sys_stats()
  99. await message.reply_text(stats)
  100. # Gban
  101. @app.on_message(filters.command("gban") & filters.user(SUDOERS))
  102. @capture_err
  103. async def ban_globally(_, message):
  104. if not message.reply_to_message:
  105. await message.reply_text("Reply to a user's message to Gban.")
  106. return
  107. from_user_id = message.from_user.id
  108. user_id = message.reply_to_message.from_user.id
  109. mention = message.reply_to_message.from_user.mention
  110. from_user_mention = message.from_user.mention
  111. if user_id == from_user_id:
  112. await message.reply_text("You want to gban yourself? FOOL!")
  113. elif user_id == BOT_ID:
  114. await message.reply_text("Should i gban myself? I'm not fool like you, HUMAN!")
  115. elif user_id in SUDOERS:
  116. await message.reply_text("You want to ban a sudo user? GET REKT!!")
  117. else:
  118. is_gbanned = await is_gbanned_user(user_id)
  119. if is_gbanned:
  120. await message.reply_text("He's already gbanned, why bully him?")
  121. else:
  122. served_chats = await get_served_chats()
  123. for served_chat in served_chats:
  124. try:
  125. await app.kick_chat_member(served_chat['chat_id'], user_id)
  126. except Exception:
  127. pass
  128. await add_gban_user(user_id)
  129. try:
  130. await app.send_message(
  131. user_id, f"""
  132. Hello, You have been globally banned by {from_user_mention},
  133. You can appeal for this ban by talking to {from_user_mention} about this.""")
  134. except Exception:
  135. pass
  136. await message.reply_text(f"Banned {mention} Globally!")
  137. # Ungban
  138. @app.on_message(filters.command("ungban") & filters.user(SUDOERS))
  139. @capture_err
  140. async def unban_globally(_, message):
  141. if not message.reply_to_message:
  142. await message.reply_to_message("Reply to a user's message to ungban.")
  143. return
  144. from_user_id = message.from_user.id
  145. user_id = message.reply_to_message.from_user.id
  146. mention = message.reply_to_message.from_user.mention
  147. if user_id == from_user_id:
  148. await message.reply_text("You want to ungban yourself? FOOL!")
  149. elif user_id == BOT_ID:
  150. await message.reply_text("Should i ungban myself? But i'm not gbanned.")
  151. elif user_id in SUDOERS:
  152. await message.reply_text("Sudo users can't be gbanned/ungbanned.")
  153. else:
  154. is_gbanned = await is_gbanned_user(user_id)
  155. if not is_gbanned:
  156. await message.reply_text("He's already free, why bully him?")
  157. else:
  158. await remove_gban_user(user_id)
  159. await message.reply_text(f"Unbanned {mention} Globally!")
  160. # Broadcast
  161. @app.on_message(
  162. filters.command("broadcast")
  163. & filters.user(SUDOERS)
  164. & ~filters.edited
  165. )
  166. @capture_err
  167. async def broadcast_message(_, message):
  168. if len(message.command) < 2:
  169. await message.reply_text("**Usage**:\n/broadcast [MESSAGE]")
  170. return
  171. text = message.text.split(None, 1)[1]
  172. sent = 0
  173. chats = []
  174. schats = await get_served_chats()
  175. for chat in schats:
  176. chats.append(int(chat["chat_id"]))
  177. for i in chats:
  178. try:
  179. await app.send_message(i, text=text)
  180. sent += 1
  181. except Exception:
  182. pass
  183. await message.reply_text(f"**Broadcasted Message In {sent} Chats.**")