# meta developer: @idiotcoders # scope: hikka_min 1.6.3 import io import logging import telethon from .. import loader, utils from ..inline.types import InlineCall @loader.tds class PromoteMod(loader.Module): """Managing administrators rights in chats.""" strings = { "name": "Promote", "not_a_chat": " The command cannot be run in private messages.", "no_rights": "🫤 I have no administrator rights or cannot promote" \ " and demote administrators.", "no_user": "⚠️ You should specify an user.", "demoted": "😂 {name} was demoted to an regular user.", "promoted_full": "👑 {name} was promoted to an administrator" \ " with full rights.\n✍️ Rank: {rank}", "promoted": "🫣 {name} was promoted to an administrator.\n" \ "✍️ Rank: {rank}", "choose_rights": "👑 Choose administrator rights for {name}" \ "\n✍️ Rank: {rank}", "right_change_info": "{emoji} Change info {channel_or_chat}", "of_channel": "of channel", "of_chat": "of chat", "right_post_messages": "{emoji} Post messages", "right_edit_messages": "{emoji} Edit posts", "right_delete_messages": "{emoji} Delete messages", "right_ban_users": "{emoji} Restrict users", "right_invite_users": "{emoji} Invite users", "right_pin_messages": "{emoji} Pin messages", "right_add_admins": "{emoji} Promote administrators", "right_anonymous": "{emoji} Anonymous", "right_manage_call": "{emoji} Manage calls", "confirm": "✅ Confirm", } strings_ru = { "name": "Promote", "not_a_chat": " Команда не может быть запущена в личных сообщениях.", "no_rights": "🫤 У меня нет прав администратора в этом чате" \ " или я не могу изменять права администраторов.", "no_user": "⚠️ Вы не указали пользователя.", "demoted": "😂 С {name} сняты права администратора.", "promoted_full": "👑 {name} повышен до администратора " \ "с полными правами.\n✍️ Должность: {rank}", "promoted": "🫣 {name} повышен до администратора.\n" \ "✍️ Должность: {rank}", "choose_rights": "👑 Выберите, какие права вы хотите дать " \ "{name}\n✍️ Должность: {rank}", "right_change_info": "{emoji} Изменение профиля {channel_or_chat}", "of_channel": "канала", "of_chat": "чата", "right_post_messages": "{emoji} Публиковать посты", "right_edit_messages": "{emoji} Изменять посты", "right_delete_messages": "{emoji} Удалять сообщения", "right_ban_users": "{emoji} Ограничивать пользователей", "right_invite_users": "{emoji} Добавлять пользователей", "right_pin_messages": "{emoji} Закреплять сообщения", "right_add_admins": "{emoji} Назначать администраторов", "right_anonymous": "{emoji} Анонимность", "right_manage_call": "{emoji} Управление звонками", "confirm": "✅ Подтвердить", "_cls_doc": "Управление правами администраторов в чатах." } async def client_ready(self, client, db): self.client = client self.logger = logging.getLogger(__name__) @loader.command( ru_doc="<пользователь> — Снятие прав администратора с пользователя." ) async def demotecmd(self, message: telethon.types.Message): """ — Demote an administrator to a user.""" if message.is_private: return await utils.answer( message, self.strings("not_a_chat", message) ) user_id = None chat = await message.get_chat() reply = await message.get_reply_message() if reply: if reply.sender_id != message._client.tg_id: user_id = reply.sender_id else: user_id = await utils.get_target(message) if (not chat.admin_rights or not chat.admin_rights.add_admins) and not chat.creator: return await utils.answer(message, self.strings("no_rights", message)) if not user_id: return await utils.answer( message, self.strings("no_user", message) ) user = await message.client.get_entity( user_id ) try: await message.client( telethon.tl.functions.channels.EditAdminRequest( message.chat_id, user.id, telethon.types.ChatAdminRights( other=False, change_info=None, post_messages=None, edit_messages=None, delete_messages=None, ban_users=None, invite_users=None, pin_messages=None, add_admins=None, anonymous=None, manage_call=None, manage_topics=None ), "" ) ) except telethon.errors.ChatAdminRequiredError: return await utils.answer(message, self.strings("no_rights", message)) await utils.answer( message, self.strings("demoted", message).format( name=user.first_name ) ) @loader.command( ru_doc="<пользователь> [роль (aka префикс)] — Повышение пользователя до администратора с полными правами." ) async def fullrightscmd(self, message: telethon.types.Message): """ [role (aka [prefix])] — Promote an user to administrator with full rights.""" if message.is_private: return await utils.answer( message, self.strings("not_a_chat", message) ) rank, user_id = "Admin", None chat = await message.get_chat() args = utils.get_args_raw(message) reply = await message.get_reply_message() if reply: if reply.sender_id != message._client.tg_id: user_id = reply.sender_id if args: rank = args else: user_id = await utils.get_target(message) if len(args.split()) > 1: rank = " ".join(args.split()[1:]) if (not chat.admin_rights or not chat.admin_rights.add_admins) and not chat.creator: return await utils.answer(message, self.strings("no_rights", message)) if not user_id: return await utils.answer( message, self.strings("no_user", message) ) user = await message.client.get_entity( user_id ) try: await message.client( telethon.tl.functions.channels.EditAdminRequest( message.chat_id, user.id, telethon.types.ChatAdminRights( other=True, change_info=True, post_messages=True if chat.broadcast else None, edit_messages=True if chat.broadcast else None, delete_messages=True, ban_users=True, invite_users=True, add_admins=True, anonymous=None, pin_messages=True if not chat.broadcast else None, manage_call=True if not chat.broadcast else None ), rank ) ) except telethon.errors.ChatAdminRequiredError: return await utils.answer(message, self.strings("no_rights", message)) await utils.answer( message, self.strings("promoted_full", message).format( name=user.first_name, rank=rank ) ) @loader.command( ru_doc="<пользователь> [роль (aka префикс)] — Повышение пользователя до администратора." ) async def promotecmd(self, message: telethon.types.Message): """ [role (aka [prefix])] — Promote an user to administrator.""" if message.is_private: return await utils.answer( message, self.strings("not_a_chat", message) ) rank, user_id = "Admin", None chat = await message.get_chat() args = utils.get_args_raw(message) reply = await message.get_reply_message() if reply: if reply.sender_id != message._client.tg_id: user_id = reply.sender_id if args: rank = args else: user_id = await utils.get_target(message) if len(args.split()) > 1: rank = " ".join(args.split()[1:]) if (not chat.admin_rights or not chat.admin_rights.add_admins) and not chat.creator: return await utils.answer(message, self.strings("no_rights", message)) if not user_id: return await utils.answer( message, self.strings("no_user", message) ) user = await message.client.get_entity( user_id ) rights = { "change_info": False, "post_messages": False, "edit_messages": False, "delete_messages": False, "ban_users": False, "invite_users": False, "pin_messages": False, "add_admins": False, "anonymous": False, "manage_call": False, "": False } markup = [] reply_markup = [] markup.append( { "text": self.strings('right_change_info').format( emoji='✏', channel_or_chat=self.strings('of_channel') if chat.broadcast else self.strings('of_chat') ), "callback": self._ch_rights, "args": [["change_info", True], rights, chat, rank, user] }, ) markup.append( { "text": self.strings('right_delete_messages').format( emoji='🗑' ), "callback": self._ch_rights, "args": [["delete_messages", True], rights, chat, rank, user] }, ) if chat.broadcast: markup.append( { "text": self.strings('right_post_messages').format( emoji='✉', ), "callback": self._ch_rights, "args": [["post_messages", True], rights, chat, rank, user] }, ) markup.append( { "text": self.strings('right_edit_messages').format( emoji='✏', ), "callback": self._ch_rights, "args": [["edit_messages", True], rights, chat, rank, user] }, ) markup.append( { "text": self.strings('right_ban_users').format( emoji='⛔', ), "callback": self._ch_rights, "args": [["ban_users", True], rights, chat, rank, user] }, ) markup.append( { "text": self.strings('right_pin_messages').format( emoji='📌', ), "callback": self._ch_rights, "args": [["pin_messages", True], rights, chat, rank, user] }, ) markup.append( { "text": self.strings('right_add_admins').format( emoji='👑', ), "callback": self._ch_rights, "args": [["add_admins", True], rights, chat, rank, user] }, ) if not chat.broadcast: markup.append( { "text": self.strings('right_manage_call').format( emoji='📞' ), "callback": self._ch_rights, "args": [["manage_call", True], rights, chat, rank, user] }, ) markup.append( { "text": self.strings('right_invite_users').format( emoji='➕', ), "callback": self._ch_rights, "args": [["invite_users", True], rights, chat, rank, user] }, ) markup.append( { "text": self.strings('right_anonymous').format( emoji='🎭', ), "callback": self._ch_rights, "args": [["anonymous", True], rights, chat, rank, user] }, ) kb = [] for i in markup: if len(kb) == 2: reply_markup.append(kb) kb = [] kb.append(i) if kb != [] and kb not in reply_markup: reply_markup.append(kb) reply_markup.append([ { "text": self.strings("confirm"), "callback": self._inline_promote, "args": [rights, chat, rank, user] } ]) await self.inline.form( message=message, text=self.strings("choose_rights").format( name=user.first_name, rank=rank ), silent=True, reply_markup=reply_markup ) async def _ch_rights(self, call: InlineCall, right: str, all_rights: dict, chat, rank: str, user): all_rights[right[0]] = right[1] markup = [] reply_markup = [] markup.append( { "text": self.strings("right_change_info").format( emoji='✏' if not all_rights.get('change_info', False) else '✅', channel_or_chat=self.strings('of_channel') if chat.broadcast else self.strings('of_chat') ), "callback": self._ch_rights, "args": [["change_info", not all_rights.get("change_info")], all_rights, chat, rank, user] }, ) markup.append( { "text": self.strings("right_delete_messages").format( emoji='🗑' if not all_rights.get('delete_messages', False) else '✅' ), "callback": self._ch_rights, "args": [["delete_messages", not all_rights.get("delete_messages", False)], all_rights, chat, rank, user] }, ) if chat.broadcast: markup.append( { "text": self.strings("right_post_messages").format( emoji='✉' if not all_rights.get('post_messages', False) else '✅' ), "callback": self._ch_rights, "args": [["post_messages", not all_rights.get("post_messages", False)], all_rights, chat, rank, user] }, ) markup.append( { "text": self.strings("right_edit_messages").format( emoji='✏' if not all_rights.get('edit_messages', False) else '✅' ), "callback": self._ch_rights, "args": [["edit_messages", not all_rights.get("edit_messages", False)], all_rights, chat, rank, user] }, ) markup.append( { "text": self.strings("right_ban_users").format( emoji='⛔' if not all_rights.get('ban_users', False) else '✅' ), "callback": self._ch_rights, "args": [["ban_users", not all_rights.get("ban_users", False)], all_rights, chat, rank, user] }, ) markup.append( { "text": self.strings("right_pin_messages").format( emoji='📌' if not all_rights.get('pin_messages', False) else '✅' ), "callback": self._ch_rights, "args": [["pin_messages", not all_rights.get("pin_messages", False)], all_rights, chat, rank, user] }, ) markup.append( { "text": self.strings("right_add_admins").format( emoji='👑' if not all_rights.get('add_admins', False) else '✅' ), "callback": self._ch_rights, "args": [["add_admins", not all_rights.get("add_admins", False)], all_rights, chat, rank, user] }, ) if not chat.broadcast: markup.append( { "text": self.strings("right_manage_call").format( emoji='📞' if not all_rights.get('manage_call', False) else '✅' ), "callback": self._ch_rights, "args": [["manage_call", not all_rights.get("manage_call", False)], all_rights, chat, rank, user] } ) markup.append( { "text": self.strings("right_invite_users").format( emoji='➕' if not all_rights.get('invite_users', False) else '✅' ), "callback": self._ch_rights, "args": [["invite_users", not all_rights.get("invite_users", False)], all_rights, chat, rank, user] }, ) markup.append( { "text": self.strings("right_anonymous").format( emoji='🎭' if not all_rights.get('anonymous', False) else '✅' ), "callback": self._ch_rights, "args": [["anonymous", not all_rights.get("anonymous", False)], all_rights, chat, rank, user] }, ) kb = [] for i in markup: if len(kb) == 2: reply_markup.append(kb) kb = [] kb.append(i) if kb != [] and kb not in reply_markup: reply_markup.append(kb) reply_markup.append([ { "text": self.strings("confirm"), "callback": self._inline_promote, "args": [all_rights, chat, rank, user] } ]) await call.edit( text=self.strings("choose_rights").format( name=user.first_name, rank=rank ), reply_markup=reply_markup ) async def _inline_promote(self, call: InlineCall, all_rights: dict, chat, rank: str, user): try: await self.client( telethon.tl.functions.channels.EditAdminRequest( chat.id, user.id, telethon.types.ChatAdminRights( other=True, change_info=all_rights.get('change_info'), post_messages=all_rights.get('post_messages') if chat.broadcast else None, edit_messages=all_rights.get('edit_messages') if chat.broadcast else None, delete_messages=all_rights.get('delete_messages'), ban_users=all_rights.get('ban_users'), invite_users=all_rights.get('invite_users'), add_admins=all_rights.get('add_admins'), anonymous=all_rights.get('anonymous'), pin_messages=all_rights.get('pin_messages') if not chat.broadcast else None, manage_call=all_rights.get('manage_call') if not chat.broadcast else None, manage_topics=all_rights.get('manage_topics') if not chat.broadcast else None ), rank ) ) except telethon.errors.ChatAdminRequiredError: return await call.edit( text=self.strings("no_rights") ) await call.edit( text=self.strings("promoted").format( name=user.first_name, rank=rank ) )