| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- """
- MIT License
- Copyright (c) 2024 TheHamkerCat
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
- """
- import asyncio
- import os
- import subprocess
- import time
- import psutil
- from pyrogram import filters, types
- from pyrogram.enums import ChatMemberStatus
- from pyrogram.errors import FloodWait
- from pyrogram.types import InlineKeyboardMarkup
- from wbb import (
- BOT_ID,
- GBAN_LOG_GROUP_ID,
- SUDOERS,
- USERBOT_USERNAME,
- app,
- bot_start_time,
- )
- from wbb.core.decorators.errors import capture_err
- from wbb.utils import formatter
- from wbb.utils.dbfunctions import (
- add_gban_user,
- get_served_chats,
- get_served_users,
- is_gbanned_user,
- remove_gban_user,
- )
- from wbb.utils.functions import extract_user, extract_user_and_reason, restart
- __MODULE__ = "Sudoers"
- __HELP__ = """
- /stats - To Check System Status.
- /gstats - To Check Bot's Global Stats.
- /gban - To Ban A User Globally.
- /clean_db - Clean database.
- /broadcast - To Broadcast A Message To All Groups.
- /ubroadcast - To Broadcast A Message To All Users.
- /update - To Update And Restart The Bot
- /restart - To Restart the bot
- /eval - Execute Python Code
- /sh - Execute Shell Code
- """
- # Stats Module
- async def bot_sys_stats():
- bot_uptime = int(time.time() - bot_start_time)
- cpu = psutil.cpu_percent()
- mem = psutil.virtual_memory().percent
- disk = psutil.disk_usage("/").percent
- process = psutil.Process(os.getpid())
- stats = f"""
- {USERBOT_USERNAME}@William
- ------------------
- 运行时长:{formatter.get_readable_time(bot_uptime)}
- 机器人内存:{round(process.memory_info()[0] / 1024 ** 2)} MB
- 处理器:{cpu}%
- 系统内存:{mem}%
- 磁盘:{disk}%
- """
- return stats
- # Gban
- @app.on_message(filters.command("gban") & SUDOERS)
- @capture_err
- async def ban_globally(_, message):
- user_id, reason = await extract_user_and_reason(message)
- user = await app.get_users(user_id)
- from_user = message.from_user
- if not user_id:
- return await message.reply_text("I can't find that user.")
- if not reason:
- return await message.reply("No reason provided.")
- if user_id in [from_user.id, BOT_ID] or user_id in SUDOERS:
- return await message.reply_text("I can't ban that user.")
- served_chats = await get_served_chats()
- m = await message.reply_text(
- f"**Banning {user.mention} Globally!**"
- + f" **This Action Should Take About {len(served_chats)} Seconds.**"
- )
- await add_gban_user(user_id)
- number_of_chats = 0
- for served_chat in served_chats:
- try:
- chat_member = await app.get_chat_member(
- served_chat["chat_id"], user.id
- )
- if chat_member.status == ChatMemberStatus.MEMBER:
- await app.ban_chat_member(served_chat["chat_id"], user.id)
- number_of_chats += 1
- await asyncio.sleep(1)
- except FloodWait as e:
- await asyncio.sleep(int(e.value))
- except Exception:
- pass
- try:
- await app.send_message(
- user.id,
- f"Hello, You have been globally banned by {from_user.mention},"
- + " You can appeal for this ban by talking to him.",
- )
- except Exception:
- pass
- await m.edit(f"Banned {user.mention} Globally!")
- ban_text = f"""
- __**New Global Ban**__
- **Origin:** {message.chat.title} [`{message.chat.id}`]
- **Admin:** {from_user.mention}
- **Banned User:** {user.mention}
- **Banned User ID:** `{user_id}`
- **Reason:** __{reason}__
- **Chats:** `{number_of_chats}`"""
- try:
- m2 = await app.send_message(
- GBAN_LOG_GROUP_ID,
- text=ban_text,
- disable_web_page_preview=True,
- )
- await m.edit(
- f"Banned {user.mention} Globally!\nAction Log: {m2.link}",
- disable_web_page_preview=True,
- )
- except Exception:
- await message.reply_text(
- "User Gbanned, But This Gban Action Wasn't Logged, Add Me In GBAN_LOG_GROUP"
- )
- # Ungban
- @app.on_message(filters.command("ungban") & SUDOERS)
- @capture_err
- async def unban_globally(_, message):
- user_id = await extract_user(message)
- if not user_id:
- return await message.reply_text("I can't find that user.")
- user = await app.get_users(user_id)
- is_gbanned = await is_gbanned_user(user.id)
- if not is_gbanned:
- await message.reply_text("I don't remember Gbanning him.")
- else:
- await remove_gban_user(user.id)
- await message.reply_text(f"Lifted {user.mention}'s Global Ban.'")
- # Broadcast
- @app.on_message(filters.command("broadcast") & SUDOERS)
- @capture_err
- async def broadcast_message(_, message):
- sleep_time = 0.1
- reply_message = message.reply_to_message
- if not reply_message:
- return await message.reply_text("Reply to a message to broadcast it")
-
- sent = 0
- schats = await get_served_chats()
- chats = [int(chat["chat_id"]) for chat in schats]
- m = await message.reply_text(
- f"Broadcast in progress, will take {len(chats) * sleep_time} seconds."
- )
- to_copy = not reply_message.poll
- for i in chats:
- try:
- if to_copy:
- await reply_message.copy(i)
- else:
- await reply_message.forward(i)
- sent += 1
- await asyncio.sleep(sleep_time)
- except FloodWait as e:
- await asyncio.sleep(int(e.value))
- except Exception:
- pass
- await m.edit(f"**Broadcasted Message In {sent} Chats.**")
- # Update
- @app.on_message(filters.command("update") & SUDOERS)
- async def update_restart(_, message):
- try:
- out = subprocess.check_output(["git", "pull"]).decode("UTF-8")
- if "Already up to date." in str(out):
- return await message.reply_text("Its already up-to date!")
- await message.reply_text(f"```{out}```")
- except Exception as e:
- return await message.reply_text(str(e))
- m = await message.reply_text(
- "**Updated with default branch, restarting now.**"
- )
- await restart(m)
- @app.on_message(filters.command("restart") & SUDOERS)
- async def update_restart(_, message):
- m = await message.reply_text(
- "**Bot is restarting now.**"
- )
- await restart(m)
- @app.on_message(filters.command("ubroadcast") & SUDOERS)
- @capture_err
- async def broadcast_message(_, message):
- sleep_time = 0.1
- sent = 0
- schats = await get_served_users()
- chats = [int(chat["user_id"]) for chat in schats]
- reply_message = message.reply_to_message
- if not reply_message:
- return await message.reply_text("Reply to a message to broadcast it")
- m = await message.reply_text(
- f"Broadcast in progress, will take {len(chats) * sleep_time} seconds."
- )
- to_copy = not reply_message.poll
- for i in chats:
- try:
- if to_copy:
- await reply_message.copy(i)
- else:
- await reply_message.forward(i)
- sent += 1
- await asyncio.sleep(sleep_time)
- except FloodWait as e:
- await asyncio.sleep(int(e.value))
- except Exception:
- pass
- await m.edit(f"**Broadcasted Message to {sent} Users.**")
|