# -*- coding: utf-8 -*-
# Module author: @Fl1yd
import io
import time
from PIL import Image
from telethon.errors import (
ChatAdminRequiredError,
PhotoCropSizeSmallError,
UserAdminInvalidError,
)
from telethon.tl.functions.channels import (
EditAdminRequest,
EditBannedRequest,
EditPhotoRequest,
)
from telethon.tl.functions.messages import EditChatAdminRequest
from telethon.tl.types import ChatAdminRights, ChatBannedRights
from .. import loader, utils
# ================== CONSTANS ========================
DEMOTE_RIGHTS = ChatAdminRights(
post_messages=None,
add_admins=None,
invite_users=None,
change_info=None,
ban_users=None,
delete_messages=None,
pin_messages=None,
edit_messages=None,
)
UNMUTE_RIGHTS = ChatBannedRights(
until_date=None,
view_messages=None,
send_messages=False,
send_media=False,
send_stickers=False,
send_gifs=False,
send_games=False,
send_inline=False,
embed_links=False,
)
BANNED_RIGHTS = ChatBannedRights(
until_date=None,
view_messages=True,
send_messages=True,
send_media=True,
send_stickers=True,
send_gifs=True,
send_games=True,
send_inline=True,
embed_links=True,
)
UNBAN_RIGHTS = ChatBannedRights(
until_date=None,
view_messages=None,
send_messages=None,
send_media=None,
send_stickers=None,
send_gifs=None,
send_games=None,
send_inline=None,
embed_links=None,
)
# =====================================================
@loader.tds
class AdminToolsMod(loader.Module):
"""Admin Tools"""
strings = {
"name": "Admin Tools",
"not_pic": "This isn`t an pic/sticker.",
"wait": "Waiting...",
"pic_so_small": "The image is too small, try another one.",
"pic_changed": "Chat pic changed.",
"promote_none": "No one to promote.",
"who": "Who is it?",
"not_admin": "I`m not an admin here.",
"promoted": "{} promoted to admin rights.\nRank: {}",
"wtf_is_it": "What is it?",
"this_isn`t_a_chat": "This isn`t a chat!",
"demote_none": "No one to demote.",
"demoted": "{} demoted to admin rights.",
"pinning": "Pin...",
"pin_none": "Reply to the message to pin it.",
"unpinning": "Unpin...",
"unpin_none": "Nothing to unpin.",
"no_rights": "I don`t have rights.",
"pinned": "Pinned successfully!",
"unpinned": "Unpinned successfully!",
"can`t_kick": "Can`t kick.",
"kicking": "Kick...",
"kick_none": "No one to kick.",
"kicked": "{} kicked from chat.",
"kicked_for_reason": "{} kicked from chat.\nReason: {}.",
"banning": "Ban...",
"banned": "{} banned in chat.",
"banned_for_reason": "{} banned in chat.\nReason: {}",
"ban_none": "No one to ban.",
"unban_none": "No one to unban.",
"unbanned": "{} unbanned in chat.",
"mute_none": "No one to mute.",
"muted": "{} now muted for ",
"no_args": "Invalid arguments specified.",
"unmute_none": "No one to unmute.",
"unmuted": "{} now unmuted.",
"no_reply": "No reply.",
"del_u_search": "Search for deleted accounts...",
"del_u_kicking": "Kick deleted accounts...\nOh~, I can do it?!",
}
async def ecpcmd(self, message):
"""Command .ecp changes the pic of the chat.\nUse: .ecp ."""
if not message.chat:
return await utils.answer(
message, self.strings("this_isn`t_a_chat", message)
)
try:
reply = await message.get_reply_message()
chat = await message.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(message, self.strings("not_admin", message))
if not reply:
return await utils.answer(message, self.strings("no_reply", message))
pic = await check_media(message, reply)
if not pic:
return await utils.answer(message, self.strings("not_pic", message))
await utils.answer(message, self.strings("wait", message))
what = resizepic(pic)
if what:
try:
await message.client(
EditPhotoRequest(
message.chat_id, await message.client.upload_file(what)
)
)
except PhotoCropSizeSmallError:
return await utils.answer(
message, self.strings("pic_so_small", message)
)
await utils.answer(message, self.strings("pic_changed", message))
except ChatAdminRequiredError:
return await utils.answer(message, self.strings("no_rights", message))
async def promotecmd(self, message):
"""Command .promote for promote user to admin rights.\nUse: .promote <@ or reply> ."""
if not message.chat:
return await utils.answer(
message, self.strings("this_isn`t_a_chat", message)
)
try:
args = utils.get_args_raw(message).split(" ")
reply = await message.get_reply_message()
rank = "admin"
chat = await message.get_chat()
adm_rights = chat.admin_rights
if not adm_rights and not chat.creator:
return await utils.answer(message, self.strings("not_admin", message))
if reply:
args = utils.get_args_raw(message)
rank = args or rank
user = await message.client.get_entity(reply.sender_id)
else:
user = await message.client.get_entity(
args[0] if not args[0].isnumeric() else int(args[0])
)
if len(args) == 1:
rank = rank
elif len(args) >= 2:
rank = utils.get_args_raw(message).split(" ", 1)[1]
try:
await message.client(
EditAdminRequest(
message.chat_id,
user.id,
ChatAdminRights(
add_admins=False,
invite_users=adm_rights.invite_users,
change_info=False,
ban_users=adm_rights.ban_users,
delete_messages=adm_rights.delete_messages,
pin_messages=adm_rights.pin_messages,
),
rank,
)
)
except ChatAdminRequiredError:
return await utils.answer(message, self.strings("no_rights", message))
else:
return await utils.answer(
message,
self.strings("promoted", message).format(user.first_name, rank),
)
except ValueError:
return await utils.answer(message, self.strings("no_args", message))
async def demotecmd(self, message):
"""Command .demote for demote user to admin rights.\nUse: .demote <@ or reply>."""
if message.is_private:
return await utils.answer(
message, self.strings("this_isn`t_a_chat", message)
)
try:
reply = await message.get_reply_message()
chat = await message.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(message, self.strings("not_admin", message))
if reply:
user = await message.client.get_entity(reply.sender_id)
else:
args = utils.get_args_raw(message)
if not args:
return await utils.answer(
message, self.strings("demote_none", message)
)
user = await message.client.get_entity(
args if not args.isnumeric() else int(args)
)
try:
if message.is_channel:
await message.client(
EditAdminRequest(message.chat_id, user.id, DEMOTE_RIGHTS, "")
)
else:
await message.client(
EditChatAdminRequest(message.chat_id, user.id, False)
)
except ChatAdminRequiredError:
return await utils.answer(message, self.strings("no_rights", message))
else:
return await utils.answer(
message, self.strings("demoted", message).format(user.first_name)
)
except ValueError:
return await utils.answer(message, self.strings("no_args"))
async def pincmd(self, message):
"""Command .pin for pin message in the chat.\nUse: .pin ."""
if message.is_private:
await utils.answer(message, self.strings("this_isn`t_a_chat", message))
return
reply = await message.get_reply_message()
if not reply:
return await utils.answer(message, self.strings("pin_none", message))
await utils.answer(message, self.strings("pinning", message))
try:
await message.client.pin_message(
message.chat, message=reply.id, notify=False
)
except ChatAdminRequiredError:
return await utils.answer(message, self.strings("no_rights", message))
await utils.answer(message, self.strings("pinned", message))
async def unpincmd(self, message):
"""Command .unpin for unpin message in the chat.\nUse: .unpin."""
if message.is_private:
await utils.answer(message, self.strings("this_isn`t_a_chat", message))
return
await utils.answer(message, self.strings("unpinning", message))
try:
await message.client.pin_message(message.chat, message=None, notify=None)
except ChatAdminRequiredError:
return await utils.answer(message, self.strings("no_rights", message))
await utils.answer(message, self.strings("unpinned", message))
async def kickcmd(self, message):
"""Command .kick for kick the user.\nUse: .kick <@ or reply>."""
if message.is_private:
return await utils.answer(
message, self.strings("this_isn`t_a_chat", message)
)
try:
args = utils.get_args_raw(message).split(" ")
reason = utils.get_args_raw(message)
reply = await message.get_reply_message()
chat = await message.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(message, self.strings("not_admin", message))
if not chat.admin_rights.ban_users:
return await utils.answer(message, self.strings("no_rights", message))
if reply:
user = await message.client.get_entity(reply.sender_id)
args = utils.get_args_raw(message)
if args:
reason = args
else:
user = await message.client.get_entity(
args[0] if not args[0].isnumeric() else int(args[0])
)
if args:
if len(args) == 1:
args = utils.get_args_raw(message)
user = await message.client.get_entity(
args if not args.isnumeric() else int(args)
)
reason = False
elif len(args) >= 2:
reason = utils.get_args_raw(message).split(" ", 1)[1]
await utils.answer(message, self.strings("kicking", message))
try:
await message.client.kick_participant(message.chat_id, user.id)
except UserAdminInvalidError:
return await utils.answer(message, self.strings("no_rights", message))
if not reason:
return await utils.answer(
message, self.strings("kicked", message).format(user.first_name)
)
return await utils.answer(
message,
self.strings("kicked_for_reason", message).format(
user.first_name, reason
),
)
except ValueError:
return await utils.answer(message, self.strings("no_args", message))
async def bancmd(self, message):
"""Command .ban for ban the user.\nUse: .ban <@ or reply>."""
if message.is_private:
return await utils.answer(
message, self.strings("this_isn`t_a_chat", message)
)
try:
args = utils.get_args_raw(message).split(" ")
reason = utils.get_args_raw(message)
reply = await message.get_reply_message()
chat = await message.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(message, self.strings("not_admin", message))
if not chat.admin_rights.ban_users:
return await utils.answer(message, self.strings("no_rights", message))
if reply:
user = await message.client.get_entity(reply.sender_id)
args = utils.get_args_raw(message)
if args:
reason = args
else:
user = await message.client.get_entity(
args[0] if not args[0].isnumeric() else int(args[0])
)
if args:
if len(args) == 1:
args = utils.get_args_raw(message)
user = await message.client.get_entity(
args if not args.isnumeric() else int(args)
)
reason = False
elif len(args) >= 2:
reason = utils.get_args_raw(message).split(" ", 1)[1]
try:
await utils.answer(message, self.strings("banning", message))
await message.client(
EditBannedRequest(
message.chat_id,
user.id,
ChatBannedRights(until_date=None, view_messages=True),
)
)
except UserAdminInvalidError:
return await utils.answer(message, self.strings("no_rights", message))
if not reason:
return await utils.answer(
message, self.strings("banned", message).format(user.first_name)
)
return await utils.answer(
message,
self.strings("banned_for_reason", message).format(
user.first_name, reason
),
)
except ValueError:
return await utils.answer(message, self.strings("no_args", message))
async def unbancmd(self, message):
"""Command .unban for unban the user.\nUse: .unban <@ or reply>."""
if message.is_private:
return await utils.answer(
message, self.strings("this_isn`t_a_chat", message)
)
try:
reply = await message.get_reply_message()
chat = await message.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(message, self.strings("not_admin", message))
if not chat.admin_rights.ban_users:
return await utils.answer(message, self.strings("no_rights", message))
if reply:
user = await message.client.get_entity(reply.sender_id)
else:
args = utils.get_args_raw(message)
if not args:
return await utils.answer(
message, self.strings("unban_none", message)
)
user = await message.client.get_entity(
args if not args.isnumeric() else int(args)
)
await message.client(
EditBannedRequest(
message.chat_id,
user.id,
ChatBannedRights(until_date=None, view_messages=False),
)
)
return await utils.answer(
message, self.strings("unbanned", message).format(user.first_name)
)
except ValueError:
return await utils.answer(message, self.strings("no_args", message))
async def mutecmd(self, message):
"""Command .mute for mute the user.\nUse: .mute <@ or reply>