Captain Ezio
Looks good
c3ccb7b
raw
history blame
10.5 kB
from Powers import LOGGER
from asyncio import sleep
from Powers.bot_class import Gojo
from Powers.database.approve_db import Approve
from pyrogram.types import Message, ChatPermissions
from Powers.utils.custom_filters import command, restrict_filter
from pyrogram.errors import RPCError, ChatNotModified, ChatAdminRequired
@Gojo.on_message(command("locktypes"))
async def lock_types(_, m: Message):
await m.reply_text(
(
"**Lock Types:**\n"
" - `all` = Everything\n"
" - `msg` = Messages\n"
" - `media` = Media, such as Photo and Video.\n"
" - `polls` = Polls\n"
" - `invite` = Add users to Group\n"
" - `pin` = Pin Messages\n"
" - `info` = Change Group Info\n"
" - `webprev` = Web Page Previews\n"
" - `inlinebots`, `inline` = Inline bots\n"
" - `animations` = Animations\n"
" - `games` = Game Bots\n"
" - `stickers` = Stickers"
),
)
return
@Gojo.on_message(command("lock") & restrict_filter)
async def lock_perm(c: Gojo, m: Message):
if len(m.text.split()) < 2:
await m.reply_text("Please enter a permission to lock!")
return
lock_type = m.text.split(None, 1)[1]
chat_id = m.chat.id
if not lock_type:
await m.reply_text(text="Specify a permission to lock!")
return
get_perm = m.chat.permissions
msg = get_perm.can_send_messages
media = get_perm.can_send_media_messages
webprev = get_perm.can_add_web_page_previews
polls = get_perm.can_send_polls
info = get_perm.can_change_info
invite = get_perm.can_invite_users
pin = get_perm.can_pin_messages
stickers = animations = games = inlinebots = None
if lock_type == "all":
try:
await c.set_chat_permissions(chat_id, ChatPermissions())
LOGGER.info(
f"{m.from_user.id} locked all permissions in {m.chat.id}")
except ChatNotModified:
pass
except ChatAdminRequired:
await m.reply_text(text="I don't have permission to do that")
await m.reply_text("πŸ”’ " + "Locked <b>all</b> permission from this Chat!")
await prevent_approved(m)
return
if lock_type == "msg":
msg = False
perm = "messages"
elif lock_type == "media":
media = False
perm = "audios, documents, photos, videos, video notes, voice notes"
elif lock_type == "stickers":
stickers = False
perm = "stickers"
elif lock_type == "animations":
animations = False
perm = "animations"
elif lock_type == "games":
games = False
perm = "games"
elif lock_type in ("inlinebots", "inline"):
inlinebots = False
perm = "inline bots"
elif lock_type == "webprev":
webprev = False
perm = "web page previews"
elif lock_type == "polls":
polls = False
perm = "polls"
elif lock_type == "info":
info = False
perm = "info"
elif lock_type == "invite":
invite = False
perm = "invite"
elif lock_type == "pin":
pin = False
perm = "pin"
else:
await m.reply_text(
text=""" Invalid Lock Type!
Use /locktypes to get the lock types"""
)
return
try:
await c.set_chat_permissions(
chat_id,
ChatPermissions(
can_send_messages=msg,
can_send_media_messages=media,
can_send_other_messages=any(
[stickers, animations, games, inlinebots]),
can_add_web_page_previews=webprev,
can_send_polls=polls,
can_change_info=info,
can_invite_users=invite,
can_pin_messages=pin,
),
)
LOGGER.info(
f"{m.from_user.id} locked selected permissions in {m.chat.id}")
except ChatNotModified:
pass
except ChatAdminRequired:
await m.reply_text(text="I don't have permission to do that")
await m.reply_text(
"πŸ”’ " + f"Locked <b>{perm}</b> for this Chat.",
)
await prevent_approved(m)
return
@Gojo.on_message(command("locks") & restrict_filter)
async def view_locks(_, m: Message):
chkmsg = await m.reply_text(text="Checking Chat permissions...")
v_perm = m.chat.permissions
async def convert_to_emoji(val: bool):
if val:
return "βœ…"
return "❌"
vmsg = await convert_to_emoji(v_perm.can_send_messages)
vmedia = await convert_to_emoji(v_perm.can_send_media_messages)
vother = await convert_to_emoji(v_perm.can_send_other_messages)
vwebprev = await convert_to_emoji(v_perm.can_add_web_page_previews)
vpolls = await convert_to_emoji(v_perm.can_send_polls)
vinfo = await convert_to_emoji(v_perm.can_change_info)
vinvite = await convert_to_emoji(v_perm.can_invite_users)
vpin = await convert_to_emoji(v_perm.can_pin_messages)
if v_perm is not None:
try:
permission_view_str = f"""<b>Chat Permissions:</b>
<b>Send Messages:</b> {vmsg}
<b>Send Media:</b> {vmedia}
<b>Send Stickers:</b> {vother}
<b>Send Animations:</b> {vother}
<b>Can Play Games:</b> {vother}
<b>Can Use Inline Bots:</b> {vother}
<b>Webpage Preview:</b> {vwebprev}
<b>Send Polls:</b> {vpolls}
<b>Change Info:</b> {vinfo}
<b>Invite Users:</b> {vinvite}
<b>Pin Messages:</b> {vpin}"""
LOGGER.info(f"{m.from_user.id} used locks cmd in {m.chat.id}")
await chkmsg.edit_text(permission_view_str)
except RPCError as e_f:
await chkmsg.edit_text(text="Something went wrong!")
await m.reply_text(e_f)
return
@Gojo.on_message(command("unlock") & restrict_filter)
async def unlock_perm(c: Gojo, m: Message):
if len(m.text.split()) < 2:
await m.reply_text("Please enter a permission to unlock!")
return
unlock_type = m.text.split(None, 1)[1]
chat_id = m.chat.id
if not unlock_type:
await m.reply_text(text="Specify a permission to unlock!")
return
if unlock_type == "all":
try:
await c.set_chat_permissions(
chat_id,
ChatPermissions(
can_send_messages=True,
can_send_media_messages=True,
can_send_other_messages=True,
can_add_web_page_previews=True,
can_send_polls=True,
can_change_info=True,
can_invite_users=True,
can_pin_messages=True,
),
)
LOGGER.info(
f"{m.from_user.id} unlocked all permissions in {m.chat.id}")
except ChatNotModified:
pass
except ChatAdminRequired:
await m.reply_text(text="I don't have permission to do that")
await m.reply_text("πŸ”“ " + "Unlocked <b>all</b> permission from this Chat!")
await prevent_approved(m)
return
get_uperm = m.chat.permissions
umsg = get_uperm.can_send_messages
umedia = get_uperm.can_send_media_messages
uwebprev = get_uperm.can_add_web_page_previews
upolls = get_uperm.can_send_polls
uinfo = get_uperm.can_change_info
uinvite = get_uperm.can_invite_users
upin = get_uperm.can_pin_messages
ustickers = uanimations = ugames = uinlinebots = None
if unlock_type == "msg":
umsg = True
uperm = "messages"
elif unlock_type == "media":
umedia = True
uperm = "audios, documents, photos, videos, video notes, voice notes"
elif unlock_type == "stickers":
ustickers = True
uperm = "stickers"
elif unlock_type == "animations":
uanimations = True
uperm = "animations"
elif unlock_type == "games":
ugames = True
uperm = "games"
elif unlock_type in ("inlinebots", "inline"):
uinlinebots = True
uperm = "inline bots"
elif unlock_type == "webprev":
uwebprev = True
uperm = "web page previews"
elif unlock_type == "polls":
upolls = True
uperm = "polls"
elif unlock_type == "info":
uinfo = True
uperm = "info"
elif unlock_type == "invite":
uinvite = True
uperm = "invite"
elif unlock_type == "pin":
upin = True
uperm = "pin"
else:
await m.reply_text(
text="""Invalid Lock Type!
Use /locktypes to get the lock types"""
)
return
try:
LOGGER.info(
f"{m.from_user.id} unlocked selected permissions in {m.chat.id}")
await c.set_chat_permissions(
chat_id,
ChatPermissions(
can_send_messages=umsg,
can_send_media_messages=umedia,
can_send_other_messages=any(
[ustickers, uanimations, ugames, uinlinebots],
),
can_add_web_page_previews=uwebprev,
can_send_polls=upolls,
can_change_info=uinfo,
can_invite_users=uinvite,
can_pin_messages=upin,
),
)
except ChatNotModified:
pass
except ChatAdminRequired:
await m.reply_text(text="I don't have permission to do that")
await m.reply_text(
"πŸ”“ " + f"Unlocked <b>{uperm}</b> for this Chat.",
)
await prevent_approved(m)
return
async def prevent_approved(m: Message):
approved_users = Approve(m.chat.id).list_approved()
ul = [user[0] for user in approved_users]
for i in ul:
try:
await m.chat.unban_member(user_id=i)
except (ChatAdminRequired, ChatNotModified, RPCError):
continue
LOGGER.info(f"Approved {i} in {m.chat.id}")
await sleep(0.1)
return
__PLUGIN__ = "locks"
__alt_name__ = ["grouplock", "lock", "grouplocks"]
__HELP__ = """
***Locks***
Use this to lock group permissions.
Allows you to lock and unlock permission types in the chat.
**Usage:**
* /lock `<type>`: Lock Chat permission.
* /unlock `<type>`: Unlock Chat permission.
* /locks: View Chat permission.
* /locktypes: Check available lock types!
**Example:**
`/lock media`: this locks all the media messages in the chat."""