# -*- 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>