from datetime import datetime as dt
from pyrogram import *
from pyrogram.types import *
from pyrogram.enums import *
from akn.utils.database import db
unmute_permissions = ChatPermissions(
can_send_messages=True,
can_send_media_messages=True,
can_send_polls=True,
can_send_other_messages=True,
can_add_web_page_previews=True,
can_change_info=False,
can_invite_users=True,
can_pin_messages=False
)
async def extract_userid(message, text: str):
def is_int(text: str):
try:
int(text)
except ValueError:
return False
return True
text = text.strip()
if is_int(text):
return int(text)
entities = message.entities
app = message._client
if len(entities) < 2:
return (await app.get_users(text)).id
entity = entities[1]
if entity.type == "mention":
return (await app.get_users(text)).id
if entity.type == "text_mention":
return entity.user.id
return None
cached_admins = {}
async def arz_update_admin_cache(client, chat_id):
admin_list = []
async for m in client.get_chat_members(chat_id, filter=ChatMembersFilter.ADMINISTRATORS):
if not m.user.is_bot and not m.user.is_deleted:
admin_list.append(m.user.id)
cached_admins[chat_id] = admin_list
return admin_list
@Client.on_callback_query(filters.regex(r"^arzunmuted_(\-?\d+)_(\d+)$"))
async def xarzunmute_cbok(client, callback):
chat_id = int(callback.matches[0].group(1))
user_id = int(callback.matches[0].group(2))
chat_member = await client.get_chat_member(chat_id, client.me.id)
if not chat_member.privileges or not chat_member.privileges.can_restrict_members:
await callback.answer("⚠️ Bot needs 'Restrict Members' permission!", show_alert=True)
try:
chat_data = await db.alldl_bot.find_one({"chat_ids": chat_id})
if not chat_data:
await callback.answer("⚠️ You can /reload again admins", show_alert=True)
return
admins = chat_data.get("chat_admins", []) if chat_data else []
if not admins:
await callback.answer("⚠️ You can /reload again admins", show_alert=True)
return
if callback.from_user.id not in admins:
await callback.answer("⚠️ Only admins can unmute!", show_alert=True)
return
user_mention = callback.from_user.mention
await client.restrict_chat_member(chat_id, user_id, unmute_permissions)
await db.alldl_bot.update_one(
{"bot_id": client.me.id},
{"$pull": {"mute_user": user_id}},
upsert=True
)
await callback.message.edit_text(
f"✅ User {user_id} unmuted by {user_mention}",
reply_markup=None
)
except Exception as e:
LOGS.error(f"Error xarzunmute_cbok: {str(e)} ")
await callback.message.edit_text(f"❌ Failed: {str(e)}")
@Client.on_callback_query(filters.regex(r"^arzunband_(\-?\d+)_(\d+)$"))
async def xarzunban_cbok(client, callback):
chat_id = int(callback.matches[0].group(1))
user_id = int(callback.matches[0].group(2))
chat_member = await client.get_chat_member(chat_id, client.me.id)
if not chat_member.privileges or not chat_member.privileges.can_restrict_members:
await callback.answer("⚠️ Bot needs 'Restrict Members' permission!", show_alert=True)
try:
chat_data = await db.alldl_bot.find_one({"chat_ids": chat_id})
chat_data = await db.alldl_bot.find_one({"chat_ids": chat_id})
if not chat_data:
await callback.answer("⚠️ You can /reload again admins", show_alert=True)
return
admins = chat_data.get("chat_admins", []) if chat_data else []
if not admins:
await callback.answer("⚠️ You can /reload again admins", show_alert=True)
return
if callback.from_user.id not in admins:
await callback.answer("⚠️ Only admins can unmute!", show_alert=True)
return
user_mention = callback.from_user.mention
await client.unban_chat_member(chat_id, user_id)
await callback.message.edit_text(
f"✅ User {user_id} unbanned by {user_mention}",
reply_markup=None
)
except Exception as e:
LOGS.error(f"Error xarzunban_cbok: {str(e)} ")
await callback.message.edit_text(f"❌ Failed: {str(e)}")
async def extract_user_and_reason(message, sender_chat=False):
args = message.text.strip().split()
text = message.text
user = None
reason = None
if message.reply_to_message:
reply = message.reply_to_message
if not reply.from_user:
if (
reply.sender_chat
and reply.sender_chat != message.chat.id
and sender_chat
):
id_ = reply.sender_chat.id
else:
return None, None
else:
id_ = reply.from_user.id
if len(args) < 2:
reason = None
else:
reason = text.split(None, 1)[1]
return id_, reason
if len(args) == 2:
user = text.split(None, 1)[1]
return await extract_userid(message, user), None
if len(args) > 2:
user, reason = text.split(None, 2)[1:]
return await extract_userid(message, user), reason
return user, reason
async def extract_user(message):
return (await extract_user_and_reason(message))[0]
@Client.on_message(
~filters.scheduled & filters.command(["reload"]) & ~filters.forwarded
)
async def arz_reload(client: Client, message: Message):
if not message.from_user:
return
bot_permissions = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot_permissions or not bot_permissions.can_restrict_members:
return await message.reply_text("❌ I need admin permissions to restrict members")
admins = await arz_update_admin_cache(client, message.chat.id)
await db.alldl_bot.update_one(
{"bot_id": client.me.id},
{
"$addToSet": {"chat_ids": message.chat.id},
"$set": {
"chat_admins": admins,
"last_updated": dt.now()
}
},
upsert=True
)
await message.reply_text(
"🔄 Admin list reloaded successfully!",
)
@Client.on_message(
~filters.scheduled
& filters.command(["ban", "dban"])
& ~filters.forwarded
)
async def arz_ban_user(client: Client, message: Message):
user_id, reason = await extract_user_and_reason(message, sender_chat=True)
bot = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot or not bot.can_restrict_members:
return await message.reply_text("I don't have enough permissions")
if not user_id:
return await message.reply_text("I can't find that user.")
if user_id == client.me.id:
return await message.reply_text("I can't ban myself.")
if user_id == 1191668125:
return await message.reply_text("I can't ban my developer!")
try:
mention = (await client.get_users(user_id)).mention
except IndexError:
mention = (
message.reply_to_message.sender_chat.title
if message.reply_to_message
else "Anon"
)
msg = (
f"**Banned User:** {mention}\n"
f"**Banned By:** [{message.from_user.mention}](tg://user?id={message.from_user.id if message.from_user else 0})\n"
)
if message.command[0][0] == "d":
await message.reply_to_message.delete()
if reason:
msg += f"**Reason:** {reason}"
await message.chat.ban_member(user_id)
await message.reply_text(
msg,
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
"⚫ Unban", callback_data=f"arzunband_{message.chat.id}_{user_id}"
)
]
]
)
)
@Client.on_message(
~filters.scheduled
& filters.command(["unban"])
& ~filters.forwarded
)
async def arz_unban_user(client: Client, message: Message):
user_id, reason = await extract_user_and_reason(message, sender_chat=True)
bot = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot or not bot.can_restrict_members:
return await message.reply_text("I don't have enough permissions")
if not user_id:
return await message.reply_text("I can't find that user.")
if user_id == client.me.id:
return await message.reply_text("I can't unban myself.")
if user_id == 1191668125:
return await message.reply_text("I can't unban my developer!")
try:
mention = (await client.get_users(user_id)).mention
except IndexError:
mention = (
message.reply_to_message.sender_chat.title
if message.reply_to_message
else "Anon"
)
msg = (
f"**Unbanned User:** {mention}\n"
f"**Unbanned By:** [{message.from_user.mention}](tg://user?id={message.from_user.id if message.from_user else 0})\n"
)
if reason:
msg += f"**Reason:** {reason}"
await message.chat.unban_member(user_id)
await message.reply_text(msg)
@Client.on_message(
~filters.scheduled
& filters.command(["banme"])
& ~filters.forwarded
)
async def arz_ban_me(client: Client, message: Message):
user_id = message.from_user.id
reason = None
if not user_id:
return await message.reply_text("I can't find that user.")
if user_id == client.me.id:
return await message.reply_text("I can't ban myself.")
if user_id == 1191668125:
return await message.reply_text("I can't ban my developer!")
try:
mention = (await client.get_users(user_id)).mention
except IndexError:
mention = (
message.reply_to_message.sender_chat.title
if message.reply_to_message
else "Anon"
)
msg = (
f"**Banned User:** {mention}\n"
f"**Banned By:** [{message.from_user.mention}](tg://user?id={message.from_user.id if message.from_user else 0})\n"
)
if reason:
msg += f"**Reason:** {reason}"
await message.chat.ban_member(user_id)
await message.reply_text(
msg,
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
"⚫ Unban", callback_data=f"arzunban_{message.chat.id}_{user_id}"
)
]
]
)
)
@Client.on_message(
~filters.scheduled
& filters.command(["mute", "dmute"])
& ~filters.forwarded
)
async def arz_mute(client: Client, message: Message):
user_id, reason = await extract_user_and_reason(message, sender_chat=True)
bot = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot or not bot.can_restrict_members:
return await message.reply_text("I don't have enough permissions")
if not user_id:
return await message.reply_text("I can't find that user.")
if user_id == client.me.id:
return await message.reply_text("I can't mute myself.")
if user_id == 1191668125:
return await message.reply_text("I can't mute my developer!")
try:
mention = (await client.get_users(user_id)).mention
except IndexError:
mention = (
message.reply_to_message.sender_chat.title
if message.reply_to_message
else "Anon"
)
msg = (
f"**Muted User:** {mention}\n"
f"**Muted By:** [{message.from_user.mention}](tg://user?id={message.from_user.id if message.from_user else 0})\n"
)
if message.command[0][0] == "d":
await message.reply_to_message.delete()
if reason:
msg += f"**Reason:** {reason}"
await message.chat.restrict_member(user_id, ChatPermissions())
await db.alldl_bot.update_one(
{"bot_id": client.me.id},
{"$addToSet": {"mute_user": user_id}},
upsert=True,
)
await message.reply_text(
msg,
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
"⚫ Unmute", callback_data=f"arzunmuted_{message.chat.id}_{user_id}"
)
]
]
)
)
@Client.on_message(
~filters.scheduled
& filters.command(["unmute"])
& ~filters.forwarded
)
async def arz_unmute(client: Client, message: Message):
user_id, reason = await extract_user_and_reason(message, sender_chat=True)
bot = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot or not bot.can_restrict_members:
return await message.reply_text("I don't have enough permissions")
if not user_id:
return await message.reply_text("I can't find that user.")
if user_id == client.me.id:
return await message.reply_text("I can't unmute myself.")
if user_id == 1191668125:
return await message.reply_text("I can't unmute my developer!")
try:
mention = (await client.get_users(user_id)).mention
except IndexError:
mention = (
message.reply_to_message.sender_chat.title
if message.reply_to_message
else "Anon"
)
msg = (
f"**Unmuted User:** {mention}\n"
f"**Unmuted By:** [{message.from_user.mention}](tg://user?id={message.from_user.id if message.from_user else 0})\n"
)
if reason:
msg += f"**Reason:** {reason}"
await message.chat.restrict_member(user_id, unmute_permissions)
await message.chat.unban_member(user_id)
await db.alldl_bot.update_one(
{"bot_id": client.me.id},
{"$pull": {"mute_user": user_id}},
upsert=True
)
await message.reply_text(msg)
@Client.on_message(
~filters.scheduled
& filters.command(["muteall"])
& ~filters.forwarded
)
async def arz_mute_all(client: Client, message: Message):
bot = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot or not bot.can_restrict_members:
return await message.reply_text("I don't have enough permissions")
if message.chat.type == ChatType.PRIVATE:
return await message.reply_text("This command is not available in private chats.")
if message.chat.type == ChatType.SUPERGROUP:
try:
await client.set_chat_permissions(
message.chat.id,
permissions=ChatPermissions()
)
await message.reply_text("All members muted successfully.")
except Exception as e:
await message.reply_text(f"Failed to mute all members: {e}")
@Client.on_message(
~filters.scheduled
& filters.command(["unmuteall"])
& ~filters.forwarded
)
async def arz_unmute_all(client: Client, message: Message):
bot = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot or not bot.can_restrict_members:
return await message.reply_text("I don't have enough permissions")
if message.chat.type == ChatType.PRIVATE:
return await message.reply_text("This command is not available in private chats.")
if message.chat.type == ChatType.SUPERGROUP:
try:
await client.set_chat_permissions(
message.chat.id,
permissions=unmute_permissions
)
await message.reply_text("All members unmuted successfully.")
except Exception as e:
await message.reply_text(f"Failed to unmute all members: {e}")
@Client.on_message(
~filters.scheduled
& filters.command(["muteme"])
& ~filters.forwarded
)
async def arz_mute_me(client: Client, message: Message):
user_id = message.from_user.id
bot = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot or not bot.can_restrict_members:
return await message.reply_text("I don't have enough permissions")
reason = None
if not user_id:
return await message.reply_text("I can't find that user.")
if user_id == client.me.id:
return await message.reply_text("I can't mute myself.")
if user_id == 1191668125:
return await message.reply_text("I can't mute my developer!")
try:
mention = (await client.get_users(user_id)).mention
except IndexError:
mention = (
message.reply_to_message.sender_chat.title
if message.reply_to_message
else "Anon"
)
msg = (
f"**Muted User:** {mention}\n"
f"**Muted By:** [{message.from_user.mention}](tg://user?id={message.from_user.id if message.from_user else 0})\n"
)
if reason:
msg += f"**Reason:** {reason}"
await message.chat.restrict_member(user_id, ChatPermissions())
await db.alldl_bot.update_one(
{"bot_id": client.me.id},
{"$addToSet": {"mute_user": user_id}},
upsert=True,
)
await message.reply_text(
msg,
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
"⚫ Unmute", callback_data=f"arzunmuted_{user_id}"
)
]
]
)
)
@Client.on_message(
~filters.scheduled
& filters.command(["adminlist"])
& ~filters.forwarded
)
async def arz_admin_list(client: Client, message: Message):
if message.chat.type == ChatType.PRIVATE:
return await message.reply_text("This command is not available in private chats.")
bot = (await client.get_chat_member(message.chat.id, client.me.id)).privileges
if not bot or not bot.can_restrict_members:
return await message.reply_text("I don't have enough permissions to list admins.")
try:
admin_listx = []
async for m in client.get_chat_members(message.chat.id, filter=ChatMembersFilter.ADMINISTRATORS):
if m.user.is_bot:
continue
if m.user.is_deleted:
continue
user = m.user
tag = f"[{user.first_name}](tg://user?id={user.id})"
role = "👑 Owner" if m.status.value == "owner" else "🔧 Admin"
admin_listx.append(f"┣ {role}: {tag}")
if not admin_list:
return await message.reply_text("No admins found.")
text = "**👥 Admin List:**\n\n" + "\n".join(admin_listx)
await message.reply_text(
text,
disable_web_page_preview=True
)
except Exception as e:
await message.reply_text(f"Failed to fetch admin list: `{e}`")
@Client.on_message(filters.incoming & filters.group, group=-1)
async def check_user_mute(client: Client, message: Message):
bot = await client.get_chat_member(message.chat.id, client.me.id)
if not bot.privileges or not bot.privileges.can_restrict_members:
return
if message.from_user and message.from_user.is_deleted:
return
if message.from_user and message.from_user.is_bot:
return
if message.chat.type == ChatType.PRIVATE:
return
user = message.from_user.id
muted_users = await db.alldl_bot.find_one({"bot_id": client.me.id})
if not muted_users or "mute_user" not in muted_users:
return
if muted_users and user in muted_users["mute_user"]:
await client.restrict_chat_member(
message.chat.id,
user,
permissions=ChatPermissions(
can_send_messages=False,
can_send_media_messages=False,
can_send_polls=False,
can_change_info=False,
can_invite_users=False,
can_pin_messages=False,
),
)