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